3.5 理解C风格字符串
有string对象之前,C++(www.cppentry.com)程序员使用以空字符结尾的字符数组表示字符串。这些字符数组现在称为C风格字符串,因为这种表示字符串的习惯是从C程序开始的。声明和初始化C风格字符串的方法和其他数组一样:
- char phrase[] = "Game Over!!!";
C风格字符串以一个称为空字符的字符结尾。空字符可以写成'\0'。上面的代码不需要使用空字符,因为它已经存储在字符串的结尾处。所以,从技术上而言,phrase有13个元素(然而,使用C风格字符串的函数则认为phrase的长度为12,这是合理的,并且与string对象的工作原理一致)。
至于其他任意类型的数组,可以在定义时指定数组大小。因此,声明和初始化C风格字符串的另一种方式是:
- char phrase[81] = "Game Over!!!";
这行代码创建了一个可以容纳80个可打印字符的C风格字符串(另外还有一个终止空字符)。
C风格字符串没有成员函数,但是作为标准库一部分的cstring文件中包含了各种使用C风格字符串的函数。
string对象的优点在于,它们被设计为可以和C风格字符串很好地结合使用。例如,下面给出的都是C风格字符串和string对象的合法用法:
- string word1 = "Game";
- char word2[] = " Over";
- string phrase = word1 + word2;
- if (word1 != word2)
- {
- cout << "word1 and word2 are not equal.\n";
- }
- if (phrase.find(word2) != string::npos)
- {
- cout << "word2 is contained in phrase.\n";
- }
string对象可以和C风格字符串连接起来,但结果仍然是一个string对象(所以char phrase2[] = word1 + word2;会产生错误)。可以使用关系运算符比较string对象和C风格字符串,甚至还可以将C风格字符串用作string对象成员函数的实参。
C风格字符串和数组有共同的缺点,其中最大的一个是它们的长度是固定的。因此,应当遵循的原则是:只要可能就使用string对象,但是如果有必要的话,需做好使用C风格字符串的准备。