Strings

Member functions

Member function name Description
s.append(str) add text to the end of a string
s.compare(str) return <0, 0, or >0 depending on relative ordering
s.erase(index, length) delete text from a string starting at given index
s.find(str), s.rfind(str) first or last index where the start of str appears in this string (returns string::npos if not found).
s.insert(index, str) add text into a string at a given index.
s.length() or s.size() number of characters in this string.
s.replace(index, len, str) replaces len chars at given index with new text.
s.substr(start, length) or s.substr(start) the next length characters beginning at start (inclusive); if length omitted, graps till end of string.
Example:
string name = "Thomas Edison";
if (name.find("Edi") != string::npos) {
  name.erase(7, 6); //"Thomas" remains
}

Operators

Stanford library for strings

function name Description
endsWith(str, suffix), startsWith(str, suffix) true if str ends or begins with the given text suffix
integerToString(int), realToString(double), stringToInteger(str), stringToReal(str) convert between numbers and strings
equalsIgnoreCase(s1, s2) true if s1 and s2 have same chars, ignoring casing
toLowerCase(str), toUpperCase(str) returns an upper/lowercase version of a string.
trim(str) return string with surrounding whitespace removed.
Example:
if (startsWith(name, "Mr. ")) {
  name += integerToString(age) + " years old";
}

Exercise: implement endsWith() using rfind() and length().

Exercise: implement endsWith() using substr() and length().

Exercise: what's the output?

void mystery(string a, string &b)
{
  a.erase(0, 1);   // erase 1 from index 0
  b += a[0];
  b.insert(3, "FOO");  //insert at index 3
}

int main()
{
  string a = "nikola";
  string b = "tesla";
  mystery(a, b);
  cout << a << " " << b << endl;
  return 0;
}
What is printed?
nikola tesFOOlai

String exercise: write a function nameDiamond that accepts a string parameter and prints its letters in a "diamond" format as shown below. For example, nameDiamond("TESLA") should print:

T
TE
TES
TESL
TESLA
 ESLA
  SLA
   LA
    A

Solution

void nameDiamond(string s)
{
  int len = s.length();
  //print top half of diamond
  for (int i = 1; i <= len; i++) {
    cout << s.substr(0, i) << endl;
  }
  //print bottom half of diamond
  for (int i = 1; i < len; i++) {
    for (int j = 0; j < i; j++) { //indent
      cout << " "; // with spaces
    }
    cout << s.substr(i, len - i) << endl;
  }
}

Another solution

void nameDiamond(string s)
{
  int len = s.length();
  //print top half of diamond
  for (int i = 1; i <= len; i++) {
    cout << s.substr(0, i) << endl;
  }
  //print bottom half of diamond
  for (int i = 1; i < len; i++) {
    s.replace(i, 1, " ");
    cout << s.substr(i, len - i) << endl;
  }
}
Question: Will this solution work if the parameter s was pass-by-reference? What if s was a const reference parameter?

C vs. C++ strings

C string bugs

C strings can't be concatenated with +. C-string + char/int produces garbage, not "hi?" or "hi41". The bug usually manifests in print statements and you will see partial strings.

C string bugs fixed

These both compile and work properly.

Similarly:

string s = "hi";  //convert to C++ string
s += '?';
Works because of auto-conversion from C string to C++ string in string a = ....

For appending integers to strings:

s += integerToString(41); //"hi?41"

Another example:

int n = stringToInteger("42"); //42

Explicit string-int conversion using Stanford library.