Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20];...

22
Chapter 8 Strings and Vectors (8.1 and 8.2)

Transcript of Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20];...

Page 1: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

Chapter 8

Strings and Vectors(8.1 and 8.2)

Page 2: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

An Array of characters

• Defined as:char firstName[20];char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of 3 characterschar firstName[20] = “Tim”; // an array of 4 characters

• ‘\0’ is called NULL character.• The variable firstName in the third example is

called a c-string variable.

‘T’, ‘i’, ‘m’ and ‘\0’

Page 3: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

An Array Type for Strings

• cstring: an array of characters ending with the null character ‘\0’.

• NULL character:– is a single character. – used in functions defined in cstring library to

denote the end of the string.– is a flag to signify the end of the string. This is call

delimiter.

Page 4: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

C-String Notes• A CString is signified by double quotes.• The length of the CString is one less than the size.

– Therefore, we must always make sure the CString length is large enough to hold ‘\0’ or we overrun string bounds.

– char w[4] ; can only hold 3 characters and ‘\0’• It may be initialized at declaration.

char name[5] = “Bill”;• When the compiler initializes a string constant, the null

character is added automatically.• A CString variable is NOT the same as an array of char--

that does not have a null character.

Page 5: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

C-String Notes (cont.)• When we build the string ourselves we must add the ‘\0’

char name[5];for ( int j = 0; j < 4; j++)

cin>>name[j];name[4] = ‘\0’;

• ‘a’ is a character constant whose size = 1• “a” is a string constant whose size 2.• When inputting into a CString, do not destroy the ‘\0’;

char oops[3] = “goo”; //NOT okchar ohno[4] = “goo”;

ohno[3] = ‘s’; //NOT ok• Can only assign string constant during variable declaration.• Cannot use the assignment operator.

char yourName[20], myName[20]=“Timothy”;yourName = myName; // illegal (Syntax error)

• Since CStrings are arrays, you must copy element by element.

Page 6: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

Predefined Functions for C-String• #include <cstring.h>• strcpy(dest, src): copies string into destination string.

– BE CAREFUL! If src string is too long it will overwrite the next storage space.– dest: (destination) must be a cstring variable.– src: (source) a string constant or a variable– Ex: char name[20], myName[20]=“Timothy”;

strcpy(name, “Robert”); // name “Robert” strcpy(name, myName); // name “Timothy”

• strncpy(dest,src, n): is the same as strcpy except that the number of characters copied is limited to n.

strncpy(name, myName, 3); // name “Tim”

• strcat(dest, src) copies the second string onto the end of the first one.– Doesn’t check for length.– dest: (destination) must be a cstring variable.– src: (source) a string constant or a variable– Ex: char fName[20]=“Timothy” , lName[20]=“Mai”;

strcat(fName, lName); // fName “TimothyMai”

Page 7: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

Predefined Functions for C-String (cont.)

• strncat(strvar, string, n) is the same as strcat except that at most n characters are copied.

strcat(lName, “, ”); // lName “Mai, ”strncat(lName, fName, 3); // lName “Mai, Tim”

• strcmp(s1, s2) compares 2 strings (used ASCII values) and returns:– A negative value if s1<s2, – 0 if s1=s2 or – A positive value if s1>s2.– Value is the difference in first 2 elements that differ.

strcmp(“band”, “bend”) returns -4. – Ex: If yourName and myName are the same???.

if(strcmp (yourName, myName) == 0) – Ex: If yourName and myName are NOT the same???.

if(strcmp (yourName, myName) != 0) or if(!strcmp (yourName, myName))

• strncmp(s1,s2, n) is the same as strcmp except it compares up to n characters.strncmp(“band”, “bend”, 1) returns 0. strncmp(“band”, “bend”, 2) returns -4.

• strlen(str) returns the length of the string (not the size!)strlen(“band”) returns 4. strlen(lName) returns 8.

b a n d

b e n d

Page 8: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

C-String Input and Output

• cin reads a string up to a blank space.• Use getline to read blank space.

– Syntax: cin.getline(CString_Var, Max_Characters + 1);

– getline reads and stores a line of max characters and puts in the ‘\0’.

– Does not stop at blanks.

Page 9: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

C-String-to-Number Conversions

• Functions to use:– atoi(CStringVar): converts a C-String to an integer.– atol(CStringVar): converts a C-String to a long

integer.– atof(CStringVar): converts a C-String to an float.– Ex: int x = atoi(“123”); double y = atof(“123.45”);

• Need: #include <cstdlib>• If the conversion cannot be made, return 0.

Page 10: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

CString-to-Number Conversions and Robust Input

• Robust Input: Guarding against improper input by always reading input in as characters/strings and converting to numbers.

• Use CString_to_number functions in cstdlib:• Ex:

char anInteger[10], aDouble[10];cin >> anInteger >> aDouble; // get inputs from user as CStringsint x = atoi(anInteger); double y = atof(aDouble);

Page 11: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

The Standard string class

• Problem with CString is that the string length is fixed.

• String class allows for length to vary and eliminates the problems of strcpy and strcat.

• You can directly compare, assign one string to another and concatenate two strings together.

• String class does an automatic conversion of cstrings to strings when mixed.

Page 12: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

string overloaded operators

• Use with <string> library#include <string>using namespace std;string name, fName, lName(“Mai”);

• Assignment: =fName = “Timothy”;

• Concatenate: +, +=name = fName + “ ” ;name += lName; // lName is concatenated to the end of name

Initialize using parameterized constructor

Initialize using default constructor.name and fName are initialized toempty string “”

Page 13: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

getline() for string objects

• Read characters from the input stream istream until an instance of the delimiter is encountered. Delimiter can be any character.istream& getline (istream& ins, string& strVar, char delimiter);

• Read characters from the input stream istream until an instance of ‘\n’ is encountered.istream& getline (istream& ins, string& strVar);

• Ex:string msg;getline (cin, msg, ‘\t’);getline (cin, msg, ‘\n’);getline (cin, msg); // same as getline (cin, msg, ‘\n’);

Page 14: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

Some member functions of class string (Constructors)

• Default constructor:string str; // create empty string

• Parameterized constructor:string str(“sample”); // create a string object with data “sample”

• Copy constructor:string str1(str); // create a string object str1 which is the copy of str

Page 15: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

Some member functions of class string (Element Access)

• length(): returns the length of a stringstring str(“Sample”);int len = str.length(); // len=6

• stringVar[i]: returns a read/write reference to the character at a specific position in the string. Does not check for illegal position. (If position is greater than the string length)

char second = str[1]; // second = ‘a’str[10] = ‘m’; // illegal index but it is ok since it is considered an array of characters

• at(i): returns a read/write reference to the character at a specific position in the string. Check for illegal position.

char second = str.at(1); // second = ‘a’str.at(10) = ‘m’; // illegal index. Exception rasied

Page 16: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

Some member functions of class string (Assignment/Modifiers)

• empty(): returns true if the string is empty (“”), false other wise.

str.empty();

• insert(pos, string): inserts a string into the current one at position pos.

string str1(“Hello World”), str2(“Beautiful ”);str1.insert(6, str2); //“Hello Beautiful World”

• erase(pos, length): removes substring of size length, starting at position pos.

str1.erase(6, 10); //“Hello World”

Page 17: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

Some member functions of class string (Comparison Operators)

• Equality or Inequality: ==, !=str1 == str2: returns if string str1 equals str2str1 != str2: returns if string str1 differs from str2

• Lexicographical comparisons: <, <=, >, >=str1 < str2: returns if string str1 is less than string str2 (ASCII)str1 <= str2: returns if string str1 is less than or equal string str2 (ASCII)str1 > str2: returns if string str1 is greater than string str2 (ASCII)str1 >= str2: returns if string str1 is greater than or equal string str2 (ASCII)

Page 18: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

Some member functions of class string (Finds)

• find(subString): returns index of the first occurrence of a sub-string in the current one.

string str1(“Hello World”), str2(“Wor”);str1.find(str2); //returns 6

• find(subString, pos): returns index of the first occurrence of a sub-string in the current one, starting at position pos.

string str1(“Hello World”), str2(“o”);str1.find(str2); //returns 4str1.find(str2, 2); //returns 4str1.find(str2, 5); //returns 7str1.find(str2, 8); //returns string::npos or -1

• find_first_of(subString, pos): returns index of the first occurrence of any character from sub-string in the current one, starting at position pos.

string str1(“Hello World”), str2(“abc”), str3(“abcd”);str1.find_first_of(str2); // returns string::npos or -1str1.find_first_of(str3); // returns 10

Page 19: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

String Example (Palindrome Testing)

• A palindrome is a string that reads the same front to back as it does back to front.

• Display 8.8 tests an input string to see if it is a palindrome.

• Our palindrome test will:– discard all spaces and punctuations– consider uppercase and lower case versions of a

letter to be the same.

Page 20: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

Palindrome Testing#include <iostream>#include <string>#include <cctype>using namespace std;

void swap (char& v1, char& v2); // Interchange the values of V1 and V2string reverse (const string& s); // Return a copy of s but with characters in reversed order.string removePunt (const string& s, const string& punt); //Returns a copy of s with any occurrences of characters in the string punt

removed.string makeLower (const string& s); //Return a copy of s that has all uppercase characters changed to lowercase,

//other characters unchanged.bool isPalindrome (const string& s); // Return true if s is a palindrome, fall otherwise.

int main(){

string str;cout << "Enter a candidate for palindrome test and press <ENTER>: "getline (cin, str);if (isPalindrome (str))

cout << "\"" << str << "\" is a palindrome.";else

cout << "\"" << str << "\" is not a palindrome.";cout << endl;return 0;

}

Page 21: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

Palindrome Testing (cont.)void swap (char& v1, char& v2){

char temp = v1;v1 = v2;v2 = temp;

}string reverse (const string& s){

int start = 0, end = s.length();string temp(s);while (start < end){ end--; swap (temp[start], temp[end]); start++;}return temp;

}// Uses <cctype> and <string>string makeLower (const string& s){

string temp(s);for (int i=0; i < s.length(); i++) temp[i] = tolower(temp[i]);return temp;

}

string removePunt (const string& s, const string& punt){

string noPunt; // initialized to empty stringint sLength = s.length();int punctLength = punt.length();

for (int i=0; i < sLength(); i++){

string aChar = s.substr(i, 1); // A one-character stringint location = punt.find(aChar, 0);if (location < 0 || location >= puntLength) noPunt += aChar; // aChar not in punt, so keep it

}return no_punt;

}bool isPalindrome (const string& s){

string punt(",;:.?!'\" "); // no space between characters, also include blankstring str(s);str = makeLower(str);string lowerStr = removePunt(str, punt);

return (lowerStr == reverse(lowerStr));}

Page 22: Chapter 8 Strings and Vectors (8.1 and 8.2). An Array of characters Defined as: char firstName[20]; char firstName[] = {‘T’, ‘i’, ‘m’}; // an array of.

CString and string conversions

char aCString[] = "This is a CString";string aString;aString = aCString;

aCString = aString; strcpy (aCString, aString); strcpy (aCString, aString.c_str());

aCString = aString.c_str();

// OK since string class has a parameterized constructor with a CString parameter.

// ILLEGAL, compiling error

// ILLEGAL, compiling error

// ok since function c_str() returns a CString

// ILLEGAL, compiling error