4.3 C风格字符串
尽管C++支持C风格字符串,但不应该在C++程序中使用这个类型。
字符串字面值的类型就是const char类型的数组。C风格字符串既不能确切地归结为C语言的类型,也不能归结为C++语言的类型。
而是以空字符null结束的字符数组。
数组的名字即是指向该数组第一个元素的指针。
1. C风格字符串的使用
C++语言通过(const)char*类型的指针来操纵C风格字符串。一般地说,我们使用指针的算术操作来遍历C风格字符串,每次对指针进行测试并递增1,直到到达结束符null为止。
string st = "My String";
const char *i = &st[0];
while(*i)
{
cout << *i << endl;
i++;
}
如果i所指向的字符数组没有null结束符,则此循环将会失败。这时,循环会从i指向的位置开始读数,知道遇到内存中某处null结束符为止。
2. C风格字符串的标准库函数
C语言标准库提供的一系列处理C风格字符串的库函数。要使用这些标准库函数,必须包含相应的C头文件。
#include <cstring>
cstring是string.h头文件的C++版本,而string.h则是C语言提供的标准库。
这些标准库函数不会检查其字符串参数。
传递给标准库函数例程的指针必须具有非零值,并且指向以null结束的字符数组中的第一个元素。其中一些标准库函数会修改传递给它的字符串,这些函数将假定它们所修改的字符串具有足够大的空间接收本函数新生成的字符,程序员必须确保目标字符串必须足够大。
string st = "My String";
const char *i = &st[0];
int len = std::strlen(i);
cout <<len <<endl;
string str2 = "My String233a";
const char *j = &str2[0];
cout << std::strcmp(i,j) << endl;
3. 永远不要忘记字符串结束符null
在使用处理C风格字符串的标准库函数时,牢记字符串必须以结束符null结束。
4. 调用者必须确保目标字符串具有足够的大小
5. 使用strn函数处理C风格字符串
string st = "A string example";
string st2 = "A different string";
const char *i = &st[0];
const char *i2 = &st2[0];
char largeStr[16+18+2];
std::strncpy(largeStr,i,17);
std:strncat(largeStr, " ", 2);
std::strncat(largeStr, i2, 19);
cout << largeStr << endl;
使用标准库函数strncat和strncpy的诀窍在于可以适当地控制复制字符的个数。特别是在复制和串连字符串时,一定要时刻记住算上结束符null。在定义字符串时要切记预留存放null字符的空间,因为每次标准库函数后都必须以此结束字符串largeStr。
6. 尽可能使用标准库类型string
如果使用C++标准库类型string,标准库负责处理所有的内存管理问题,我们不必再担心每一次修改字符串时涉及到的大小问题。
对大部分的应用而言,使用标准库类型string,除了增强安全性外,效率也提高了,因此应该尽量避免使用C风格字符串。