You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:47:16