I made a few improvements…
/* More with strings */ #include <iostream> #include <iomanip> #include <string> #include <vector> using namespace std; int main() { string aLine; // used later: string firstPart; string lastPart; string scrambled; string emphasis; // More on strings // cout << "First let's read in some text. Use getline so that we get a whole line and not just the first word: "; getline(cin,aLine); cout << endl; cout << "You typed \"" << aLine << "\"" << endl; cout << endl; cout << "If you typed exactly \"C++ is cool\", you MIGHT get an A in the class. Let's check for that:" << endl; cout << endl; if ("C++ is cool" == aLine) { cout << "You MIGHT get an A" << endl; } cout << endl; cout << "Even if you merely INCLUDED the text \"C++ is cool\", you MIGHT get an A in the class. Let's check for that:" << endl; cout << endl; // string::npos is returned by find if the string is NOT found, so if the npos is NOT returned by find, it must be there some where! if (string::npos != aLine.find("C++ is cool")) { cout << "You MIGHT get an A" << endl; } cout << endl; cout << "Suppose we wanted to know where you said it?" << endl; cout << endl; // We should have defined a const string for this very important string at the start of this function, but let's do it here: const string importantString = "C++ is cool"; // IMPORTANT, it turns out that c++ does not like: // int index = aLine.find(importantString); // because it knows that the position returned can never be negative! It will give a warning about this. // so we need to put the value in an unsigned variable, you can use "unsigned long" or "size_t" size_t index = aLine.find(importantString); if (string::npos == index) { cout << "\"" << importantString << "\" not found." << endl; } else { cout << "\"" << importantString << "\" found at index " << index << "." << endl; } cout << endl; cout << "The same but using unsigned long:" << endl; cout << endl; unsigned long anotherIndex = aLine.find(importantString); if (string::npos == anotherIndex) { cout << "\"" << importantString << "\" not found." << endl; } else { cout << "\"" << importantString << "\" found at index " << anotherIndex << "." << endl; } cout << endl; cout << "Suppose we wanted to count how many time you said it?" << endl; cout << endl; unsigned long startingAt = 0; int count = 0; index = 0; // there are many ways to structure this loop here is one: while (true) { index = aLine.find(importantString,startingAt); if (string::npos != index) { cout << "found it" << endl; ++count; startingAt = index + importantString.length(); } else { break; } } cout << "You said \"" << importantString << "\" " << count << " times." << endl; cout << endl; cout << "Suppose we wanted to scramble your sentence?" << endl; cout << endl; anotherIndex = aLine.find(importantString); if (string::npos == anotherIndex) { cout << "\"" << importantString << "\" not found." << endl; } else { // remember that substr wants the starting point and (optionally) the length to extract firstPart = aLine.substr(0,anotherIndex); // skip over the important string because we know what that is! lastPart = aLine.substr(anotherIndex+importantString.length()); // no length to extract because we want everything to the end scrambled = lastPart + firstPart + importantString; cout << "Scrambled String: \"" << scrambled << "\"." << endl; } cout << endl; cout << "If you type \"first part C++ is cool last part\", it is a bit awkward with the spaces" << endl; cout << "There are many ways to improve on this, but lets just include a space in the important string, like:" << endl; const string betterImportantString = "C++ is cool "; // I have to make a new const, I can't change the other one. Note the space after "cool" cout << "\"" << betterImportantString << "\"" << endl; cout << endl; anotherIndex = aLine.find(betterImportantString); if (string::npos == anotherIndex) { cout << "\"" << betterImportantString << "\" not found." << endl; } else { // remember that substr wants the starting point and (optionally) the length to extract firstPart = aLine.substr(0,anotherIndex); // skip over the important string because we know what that is! lastPart = aLine.substr(anotherIndex+betterImportantString.length()); // no length to extract because we want everything to the end scrambled = lastPart + firstPart + betterImportantString; cout << "Slightly better scrambled String: \"" << scrambled << "\"." << endl; cout << "We could do more to try to clean it up, but this might not be a good idea depending on what the user typed" << endl; scrambled = lastPart + string(" ") + firstPart + betterImportantString.substr(0,betterImportantString.length()-1); cout << "POSSIBLY better scrambled String: \"" << scrambled << "\"." << endl; cout << "Maybe even better, let's let's force the first character to be uppercase and add a period." << endl; // if we wanted it to be lower we would use tolower() if (0 < lastPart.length()) { lastPart[0] = toupper(lastPart.at(0)); } scrambled = lastPart + string(" ") + firstPart + betterImportantString.substr(0,betterImportantString.length()-1) + string("."); cout << "I sort of like this one: \"" << scrambled << "\"." << endl; } cout << endl; //system("pause"); return 0; }Back to top