C++ strcat()函数工作原理及字符拼接异常问题求助
问题根源
strcat函数的第二个参数要求是以空字符'\0'结尾的C风格字符串,但你传入的是单个char变量的地址(比如&a)。内存中这个单个字符后面没有紧跟'\0',所以strcat会持续从内存中读取数据,直到偶然碰到'\0'为止——这属于未定义行为,输出的多余字符就是这么来的。
比如你的代码里a和b可能在内存中连续存储('T'后面就是'H'),第一次调用strcat(myStr, &a)时,函数会把'T'、'H'以及后面直到'\0'的所有内容都拷贝到myStr里;第二次调用strcat(myStr, &b)又会重复这个过程,最终就出现了混乱的输出。
另外你尝试的两个操作都是无效的:
strcat(myStr, "\0"):strcat本身就是找到目标字符串的末尾('\0'位置)进行拷贝,传入"\0"相当于什么都没添加。cout << myStr << '\0':cout输出字符串时会自动在第一个'\0'处停止,后面的'\0'不会产生任何效果。
正确解决方法
方法1:将单个字符转为合法的C风格字符串
把单个字符放在长度为2的字符数组里,编译器会自动补全'\0':
#include <iostream> #include <cstring> using namespace std; int main() { char myStr[20] = ""; const char a[] = "T"; // 等价于 {'T', '\0'} const char b[] = "H"; strcat(myStr, a); strcat(myStr, b); cout << myStr; // 输出TH return 0; }
方法2:手动维护字符数组的长度
直接操作数组下标,最后手动添加终止符:
#include <iostream> #include <cstring> using namespace std; int main() { char myStr[20] = ""; int len = 0; myStr[len++] = 'T'; myStr[len++] = 'H'; myStr[len] = '\0'; // 必须手动添加终止符 cout << myStr; // 输出TH return 0; }
方法3:使用C++的std::string(推荐)
如果是C++开发,完全没必要用C风格字符数组,std::string会自动处理内存和终止符:
#include <iostream> #include <string> using namespace std; int main() { string myStr; myStr += 'T'; myStr += 'H'; cout << myStr; // 输出TH return 0; }
内容的提问来源于stack exchange,提问作者spark lee
相关产品推荐
相关产品推荐

