在C++中,字符串可以通过字符数组(character array)或者std::string
类来表示。字符数组是一个字符的集合,以空字符('\0'
)结尾,这是C风格字符串的特性。
①字符数组未正确终止
char ch[5] = { '1','2','3','4','5' }; // 打印会出现乱码
这里,ch
数组包含了5个字符,但没有空字符('\0'
)来终止字符串。因此,当cout
尝试打印这个数组时,它会继续读取内存直到遇到一个空字符,这可能导致打印出乱码或者程序崩溃(如果读取到了不可访问的内存)。
②字符数组正确终止
char ch2[6] = { '1','2','3','4','5' }; // 实际上是 {'1','2','3','4','5','\0'}(自动填充)
在C++中,当字符数组的初始化列表中的字符数量少于数组大小时,剩余的位置会被自动填充为空字符('\0'
)。因此,ch2
实际上是一个正确终止的字符串。当使用cout
打印时,它会在到'\0'
时停止。
③输入与输出
cout << ch; // 输出可能乱码,因为ch没有正确终止
对于输出,无论是cout
还是printf
,它们都会在遇到'\0'
时停止打印。如果字符串没有正确终止,它们可能会继续读取内存直到遇到'\0'
或者发生错误。
④使用cin.getline
读取字符串
const int len = 128;
char str[len]{};
// cin.getline(str, len); // 以回车作为字符串的结束符
cin.getline(str, len,'#'); // 也可以指定'#'作为结束符
cout << str << endl;
这里,cin.getline
函数用于从标准输入读取一行字符串,直到达到指定的长度(len
)或者遇到指定的结束符(在这个例子中是'#'
)。读取的字符串会被存储在str
数组中,并自动以'\0'
终止。
总结
- 字符数组必须以空字符(
'\0'
)终止,否则可能会导致未定义行为。 - 在C++中,当字符数组的初始化列表中的字符数量少于数组大小时,剩余的位置会被自动填充为空字符。
cout
和printf
在打印字符串时,会在遇到'\0'
时停止。cin.getline
函数可以用于从标准输入读取一行字符串,直到达到指定的长度或者遇到指定的结束符。