1 / 39

C-strings and C++ string Class

C-strings and C++ string Class. 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. Strings.

valin
Télécharger la présentation

C-strings and C++ string Class

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

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: r e ! H i t h 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!");

  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

  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 OKchar name2[20];name2 = “Nancy”; // Now allowed char name3[20];strcpy(name3, “Nancy”); //Copycout << 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 • intstrcmp(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

  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

  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>

  16. Character Testing Require #include<cctype>

  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(string str) initializes string object with str • string(char *cstr) initializes string ojbect with C-string • Various other constructorswww.cplusplus.com

  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 (chch, 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 www.cplusplus.com

  22. Overloaded string Operators

  23. Overloaded string Operators (continued)

  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 (inti = 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"; cout << "Name 1: " << name1 << endl; cout << "Name 2: " << name2 << endl;

  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(intpos, 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 “1234567.89” 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 • dp  position of decimal point in stringpos  dp • Loop (while dp is greater than 3) go back 3 places in the string insert ‘,’ thereEnd 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 frequency

  32. In Main() // 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-spacecout << str1; • string str2;getline(cin, str2); // delimitted by // by eol

  37. Your Turn • Problem: • 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

More Related