Lesson
24 - apstring class
INTRODUCTION: Strings are needed in many large programming tasks. Much of the information which identifies a person must be stored as a string: name, address, city, social security number, etc.
A standard apstring class has been provided for your use. Your job in this lesson is to learn the specifications of the apstring class and use it to solve string-processing questions.
The key topics for this lesson are:
A. C-style Strings
B. The apstring Constructors
C. String Assignment Operations
D. String Accessor Functions
E. String Indexing
F. String Modifiers and Concatenations
G. String Input/Output Operators
H. String Relational Operators
VOCABULARY: none
DISCUSSION: A. C-style Strings
1. A string is defined as a collection of characters with a special terminating character at the end of the string. Strings are different from character variables in that strings can hold more than one character at a time. Here are some examples of strings:
California
computer
school
2. The apstring class has been coded using a C-style string as a private data member. A string in C is implemented as an array of char, terminated with the null character, '\0' (that's a zero).
3. So the C-style string to store our favorite C++ output, "hello world" is actually stored as:
"hello world\0"
4. The apstring class will use a mixture of C++ code and C routines to implement the string abstraction. However, do not worry about the C programming tools used in the apstring class. The only C programming syntax you need to know about strings is that they end with '\0'.
5. The rest of the student outline parallels the list of constructors, member functions, and non-member free functions given in Handout H.A.24.1, apstring Class. Assume that the identifiers word1, word2, and word3 are all of type apstring.
B. The apstring Constructors
1. There are 3 constructors in the apstring class:
Constructor |
Sample syntax |
apstring(); |
apstring word1; // word1 is an empty string |
apstring (const char *s = 0); |
apstring word1 ("Hello world\0"); // construct and copy a C-style string |
apstring (const apstring &x); |
apstring word2 (word1); // copy constructor |
C. String Assignment Operations
1. The apstring class has been overloaded to support three different assignment operations.
Assignment Operator |
Sample syntax |
const apstring & operator = (const apstring &str); |
word2 = word1; |
const apstring & operator = (const char *s); |
word1 = "Hello world\0"; |
const apstring & operator = (char ch); |
word1 = 't'; |
2. As expected for an assignment operator, these three overloaded versions of the assignment operator return the value assigned. For example, in the statement word2 = word1, this expression returns the value of word1. The allows for chaining of statements like
word3 = word2 = word1;
D. String Accessor Functions
1. There are five accessor functions in the apstring class. Notice that all five are const member functions. The apstring object is protected from any changes when the object is inspected.
Accessor function |
Sample syntax |
int length() const; |
int len = word1.length(); |
int find (const apstring &str) const; |
int n = word1.find(word2); |
int find (char ch) const; |
int n = word1.find('t'); |
apstring
substr
(int pos,
int
len) const; |
word2 = word1.substr (1,3); // returns an apstring 3 characters long // starting at pos 1 of word1 |
const
char*
c_str () const; |
char * cstring = word1.c_str(); |
2. The function int find (const apstring &str) will find the first occurrence of str within this apstring and return the index of the first character. If str does not occur in this apstring, the function returns npos. The value npos is a const value defined in the apstring class and can be used in your programs. Use the identifier npos and not the value -1 as assigned in the apstring.cpp implementation.
3. The function int find (char ch) is identical in function and output to the other find function except it is looking for a single character.
4. Here is a more complete example of using substr:
word1
= "San Jose, California\0";
small
= word1.substr(4,8);
cout
<< small << endl;
Run output:
Jose, Ca
It is important to remember that strings are stored from position 0..length-1 of an array. In the example above, word1[4] is the 5th character in the string.
5. The const char* c_str() const function allows you to convert an apstring to a C-style string. Here is an example:
void demo (const apstring &w1)
{
char *cstring;
cstring = w1.c_str();
puts (cstring); // tool in stdio.h to output a char* C-style string
}
6. Converting apstrings to c-style strings is useful in opening a text file for processing. For example:
void demoFiles (apstring fileName)
{
char *fn = fileName.c_str(); // converts fileName to c-style string
ifstream inFile; // use fn to open and link inFile
inFile.open(fn,ios::in);
if (inFile.fail())
{
cerr << "Could not open " << fileName << endl;
abort();
}
else
// ... rest of code ...
}
E. String Indexing
1. Because apstrings are implemented as arrays of characters, it is possible to manipulate strings using the [] indexing operator. The following code is legal:
int
len = word1.length();
for
(int k=0;
k < len; k++)
cout << word1[k];
This will print out the string.
2. It is also possible to change the contents of a string using the index operator. The following code will convert any lower case letters in a string into upper case letters.
int len = word1.length();
for (int k=0; k < len; k++)
if (('a' <= word1[k]) && (word1[k] <= 'z'))
word1[k] -= 32;
F. String Modifiers and Concatenations
1. The += operator has been overloaded to work with strings. The following statements are possible.
word1
+= word2;
//
this appends word2 to the end of word1
word1
+= 's';
// this appends an 's' to the end of word1
2. You can also write similar statements using the + and = operator. The following statements are legal using the apstring class.
word1 = word1 + word2; // this has the same effect as word1 += word2;
word2 = word1 + 's'; // you can add a char to a string
word2 = 's' + word1; // or vice versa
G. String Input/Output Operators
1. The output operator (<<) has been overloaded to work with apstrings.
cout
<< word1
<< endl;
// sends word1
to cout
2. The input operator (>>) has also been overloaded to support input of strings, but it has limitations. It redirects input to a string until a whitespace character is encountered (tab, space bar, return key). For example:
cout
<< "Enter a string ---> ";
cin
>> word1;
cout
<< endl << "word1 = " << word1
<< endl;
Run output:
Enter a string ---> hello world
word1 = hello
3. In the above example, the attempt to enter the string as "hello world" was unsuccessful. Only the word "hello" was accepted and stored in word1.
4. An alternative tool to allow for input of a string with whitespace is getline. Here is a sample usage of getline:
getline (cin, word1);
H. String Relational Operators
1. Two strings can be compared using any of the standard relational operators: ==, !=, <, >, <=, >=.
2. Examples:
word1 < word2
word1 != word2
word1 > "hello"
3. A string can be compared to a C-style string.
SUMMARY/REVIEW: The use of pre-existing code (classes) has helped reduce the time and cost of developing new programs. In this lesson you will use the apstring class without knowing its inner details. This is an excellent example of data type abstraction.
ASSIGNMENT:
Lab Exercise, L.A.24-1, Strings