Presentation is loading. Please wait.

Presentation is loading. Please wait.

C-strings and C++ string Class

Similar presentations


Presentation on theme: "C-strings and C++ string Class"— Presentation transcript:

1 C-strings and C++ string Class

2 Topics C-Strings Library Functions for Working with C-Strings
Conversions Between Numbers and Strings Character Testing Character Case Conversion Writing Your Own C-String Handling Functions C++ string Class

3 Strings C-string: array of characters terminated by NULL character
The C-string "Hi there!" would be stored in memory as shown: H i t h e r e ! \0

4 Array of char Array of char can be defined and initialized to a C-string char str1[20] = "hi there!"; Array of char can be defined and later have a string copied into it char str2[20]; strcpy(str2, "hi there!"); see pr12-03.cpp

5 Pointer to char Pointer to char can refer to C-strings defined as arrays of char char str[20] = "hi"; char *pStr = str; cout << pStr; // prints hi Can dynamically allocate memory to be used for C-string using new See Pr12-04.cpp

6 Library Functions for C-Strings
(Requires #include <cstring>) int strlen(char *str) // Returns length of a C-string: cout << strlen("hello"); // Prints: 5

7 const int LENGTH = 30; char line[LENGTH]; cout << "Enter a string (no more than " << LENGTH - 1 << " characters.)\n"; cin.getline(line, LENGTH); cout << "The C-string read was " << "\"" << line << "\"" << " whose length was " << strlen(line) << endl;

8 strcpy char name[20] = “Mary” // This is OK char name2[20]; name2 = “Nancy”; // Now allowed char name3[20]; strcpy(name3, “Nancy”); // Copy cout << name3; // Prints Nancy

9 strcpy strcpy(char *dest, char *source) // Copies a string from a source address // to a destination address char name[15]; strcpy(name, "Deborah"); cout << name; // prints Deborah

10 strcat strcat(char *dest, char *source) // Takes two C-strings as input // Adds the contents of the second string to the // end of the first string: char str1[15] = "Good "; char str2[30] = "Morning!"; strcat(str2, str1); cout << str1; // prints: Good Morning! No automatic bounds checking: programmer must ensure that str1 has enough room for result

11 strcmp int strcmp(char *str1, char*str2) // Compares strings stored at two addresses Returns a value: less than 0 if str1 precedes str2 equal to 0 if str1 equals str2 greater than 0 if str1 succeeds str2 See pr12-06.cpp

12 strcmp Often used to test for equality if(strcmp(str1, str2) == 0)
cout << "equal"; else cout << "not equal"; Also used to determine ordering of C-strings in sorting applications Note that C-strings cannot be compared using == or > if (str1 > str2) -- this is not allowed (compares addresses of C-strings, not contents) If See pr12-05.cpp, pr12-07.cpp, and cpp

13 Swapping const int NAME_LENGTH = 20; char name1[NAME_LENGTH]; char name2[NAME_LENGTH]; char temp[NAME_LENGTH]; strcpy(name1, "William"); strcpy(name2, "Catherine"); cout << "Originally...\n"; cout << "Name1: " << name1 << endl; cout << "Name2: " << name2 << endl;

14 Swapping (cont.) if (strcmp(name1, name2) > 0) { strcpy(temp, name1); strcpy(name1, name2); strcpy(name2, temp); } cout << "\nAfter switch...\n"; cout << "Name1: " << name1 << endl; cout << "Name2: " << name2 << endl;

15 Character Testing Requires #include <cctype> FUNCTION MEANING
isalpha() true if arg. is a letter, false otherwise isalnum() true if arg. is a letter or digit, false otherwise isdigit() true if arg. is a digit 0-9, false otherwise islower() true if arg. is lowercase letter, false otherwise See pr12-12.cpp, pr12-13.cpp

16 Character Testing Require #include<cctype> FUNCTION MEANING
isprint() true if arg. is a printable character, false otherwise ispunct() true if arg. is a punctuation character, false otherwise isupper() true if arg. is an uppercase letter, false otherwise isspace() true if arg. is a white space character, false otherwise

17 C++ String Class

18 The C++ string Class The string class offers several advantages over C-style strings: large body of member functions overloaded operators to simplify expressions Requires #include <string>

19 string class constructors
string(string str) initializes string object with str string(char *cstr) initializes string ojbect with C-string Various other constructors See pr12-18.cpp

20 String Class Member Functions
int find(string str) // returns the position of str in the string object int find (char ch) // returns the position of ch in the string object int find (string str, int x) // returns the position of str beyond x int find (ch ch, intx) // returns the position of ch beyond

21 String Class Member Functions (cont.)
void insert (int x, string str) // inserts str at position x void insert (int x, char ch) // inserts char at position x string replace(int pos, int n, string str) // replaces n characters starting at pos with // substring str Other member functions

22 Overloaded string Operators
MEANING >> reads whitespace-delimited strings into string object << outputs string object to a stream = assigns string on right to string object on left += appends string on right to end of contents of string on left See pr12-19.cpp and pr12-20.cpp

23 Overloaded string Operators (continued)
MEANING + Returns concatenation of the two strings [] references character in string using array notation >, >=, <, <=, ==, != relational operators for string comparison. Return true or false

24 Overloaded string Operators
string word1, phrase; string word2 = " Dog"; cin >> word1; // user enters "Hot" // word1 has "Hot" phrase = word1 + word2; // phrase has // "Hot Dog" phrase += " on a bun"; for (int i = 0; i < 16; i++) cout << phrase[i]; // displays // "Hot Dog on a bun"

25 Swapping Two Strings string name1 = "William";
string name2 = "Catherine"; string temp; cout << "Originally...\n"; cout << "Name 1: " << name1 << endl; cout << "Name 2: " << name2 << endl; if (name1 > name2){ temp = name1; name1 = name2; name2 = temp; } cout << "\nAfter swap...\n";

26 Conversion to C-strings
data() and c_str() both return the C-string equivalent of a string object Useful when using a string object with a function that is expecting a C-string char greeting[20] = "Have a "; string str("nice day"); strcat(greeting, str.data());

27 Modification of string objects
str.insert(int pos, string s) inserts s at position pos in str Convert constructor for string allows a C-string to be passed in place of s string str("Have a day"); str.insert(7, "nice "); insert is overloaded for flexibility

28 Modification of string objects
str.append(string s) appends contents of s to end of str Convert constructor for string allows a C-string to be passed in place of s string str("Have a "); str.append("nice day"); append is overloaded for flexibility

29 Your Turn (Formatting Number)
Problem: Design a function which formats a string like “ ” to “$1,234,567.89”. Plan: Find the position dp of the decimal point Starting at dp, count backwards and insert a comma every 3 places. At position 0, insert ‘$’.

30 Refinement dp 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 . 9 dp  position of decimal point in string pos  dp Loop (while dp is greater than 3) go back 3 places in the string insert ‘,’ there End Loop Insert “$” at front of string

31 Your Turn Write a program which inputs a long text and counts the frequency of occurrence of each letter in the text. letters 1 2 3 4 5 23 24 25 frequency 8 1 2 20 3 7

32 In Main() const int MAX = 26; int frequency[MAX]; string text;
// Declarations const int MAX = 26; int frequency[MAX]; string text; cout << "Please enter a “ “substantially long text.\n"; getline(cin, text); string input(text); // convert to // c-string letterFrequency(frequency, MAX, input);

33 Letter Frequency The quick brown fox jumps over the lazy dog.
Pack my box with five dozen liquor jugs. Now is the time for all good people to come to the aid of their country.

34 letterFrequency() void letterFrequency(int frequency[], int count, string input) { // Initialize requency for (int i = 0; i < count; i++){ frequency[i] = 0; } // Count frequency int length = input.length(); for (int i = 0; i < length; i++) { switch(input[i]) case 'a': case 'A': frequency[0]++; break; case 'b': case 'B': frequency[1]++; break;

35 letterFrequency() (cont.)
case 'c': case 'C': frequency[2]++; break; case 'd': case 'D': frequency[3]++; break; case 'e': case 'E': frequency[4]++; break; . . . . . .; case 'x': case 'X': frequency[23]++; break; case 'y': case 'Y': frequency[24]++; break; case 'z': case 'Z': frequency[25]++; break; default:; } // switch }

36 String I/O string str1; cin >> str1; // delimitted by // white-space cout << str1; string str2; getline(cin, str2); // delimitted by // by eol

37 Your Turn Problem: Assumption:
Input a long sentence and count the number of words. Assumption: All words are delimitted by a single space.

38 In Main() // Input text // wordCount = countWords(text)
// Output results

39 countWords() int countWords(string text) Loop (while length > 0 && !done) ps  position of ‘ ‘ in text If (ps = 0) done  true End If Add one to count Replace first part of text with “” End Loop


Download ppt "C-strings and C++ string Class"

Similar presentations


Ads by Google