C语言新手求助:使用strcat函数拼接字符串出现异常结果
问题分析与解决
你的代码核心问题是字符串未正确以空字符\0结尾,C语言中所有字符串操作函数(strlen/strcpy/strcat等)都依赖这个结束标记识别字符串边界,缺少它会导致函数读取/写入超出数组范围的内存,引发乱码。
具体错误点:
char one[5] = "abcde";:"abcde"包含5个字符,但C字符串需要额外1个字节存\0,数组长度至少要6,否则\0无位置存放,strlen会持续读取直到找到随机的\0,结果完全不可控。char two[3] = "fgh";:同理,数组长度至少要4。char three[8] = "ijklmnop";:数组长度至少要9。char str[ size ];的size计算未包含两个_的长度,且未额外加1字节存\0,拼接后的字符串无结束标记,printf输出会乱码。
修正后的代码:
#include <stdio.h> #include <string.h> int main() { // 数组长度自动适配(包含\0),无需手动指定 char one[] = "abcde"; char two[] = "fgh"; char three[] = "ijklmnop"; // 加上两个_的长度,再加1字节存\0 int size = strlen(one) + strlen(two) + strlen(three) + 2 + 1; char str[size]; strcpy(str, one); strcat(str, "_"); strcat(str, two); strcat(str, "_"); strcat(str, three); printf("string is: %s\n", str); return 0; }
额外提示:
- 定义字符串时直接写
char 变量名[] = "字符串内容";,编译器会自动计算包含\0的数组长度,避免手动计算出错。 - 内存越界在C语言中不会直接报错,但会引发不可预测的行为(乱码、程序崩溃等),牢记字符串必须以
\0结尾是避免这类问题的关键。
内容的提问来源于stack exchange,提问作者Nully
相关产品推荐
相关产品推荐

