C语言中从char[]拼接字符串返回错误值问题咨询
嘿,我帮你分析下这个问题哈——你用strcat逐个拼接字符时最终结果异常,核心是没搞懂C语言字符串的终止规则和strcat的工作逻辑,咱们来一步步理清楚:
为啥会出问题?主要俩原因
(1)data数组缺了字符串终止符'\0'
你声明的static char data[] = {'{','"','x','"',':',...}是纯字符数组,末尾没加'\0'。C语言里所有字符串操作函数(比如strcat、printf("%s"))都靠这个终止符来识别字符串的结束位置。你的data刚好17个字符,全是JSON内容,没多余空间放'\0',后续操作就会乱读内存,搞出奇怪的结果。
(2)strcat的使用方式不对
strcat的规则是:第二个参数必须是以'\0'结尾的完整C字符串。如果你直接把单个字符的地址传给它(比如strcat(dest, &data[i])),strcat会一直往后读内存,直到碰巧找到一个随机的'\0',拼出来的内容自然混乱。另外,如果你的目标字符串dest初始化时没设'\0'(比如直接char dest[100];),strcat都找不到拼接的起始位置,也会出错。
给你俩修复方案,按需选
方案一:修正data数组,正确用strcat拼接
#include <stdio.h> #include <string.h> int getDataLength(){ return 18; // 要额外留一个位置给'\0' } // 末尾加'\0',让data变成合法的C字符串 static char data[] = {'{','"','x','"',':','1','2','3',',','"','y','"',':','1','3','7','}','\0'}; int main() { char dest[100]; dest[0] = '\0'; // 初始化目标字符串,确保以'\0'开头 int len = getDataLength(); for(int i = 0; i < len - 1; i++){ // 跳过最后的'\0' char temp[2]; temp[0] = data[i]; temp[1] = '\0'; // 把单个字符包装成带终止符的小字符串 strcat(dest, temp); printf("Current char: %c\n", data[i]); // 打印单个字符验证 } printf("Final string: %s\n", dest); return 0; }
方案二:直接用数组下标赋值(更高效)
既然是逐个字符复制,其实没必要用strcat,直接操作数组下标更简单高效,还不容易出错:
#include <stdio.h> #include <string.h> int getDataLength(){ return 17; } static char data[] = {'{','"','x','"',':','1','2','3',',','"','y','"',':','1','3','7','}'}; int main() { char dest[100]; int len = getDataLength(); for(int i = 0; i < len; i++){ dest[i] = data[i]; printf("Current char: %c\n", data[i]); } dest[len] = '\0'; // 手动加终止符,让dest变成合法字符串 printf("Final string: %s\n", dest); return 0; }
最后再提几个关键点,避免以后踩坑
- 所有要做字符串操作的字符数组,必须以
'\0'结尾,否则会触发未定义行为(结果完全不可预测)。 strcat适合拼接完整的字符串,拼接单个字符时用数组下标赋值更高效。- 如果你的
data是用来存JSON字符串,直接用字符串字面量声明更省心:static char data[] = "{\"x\":123,\"y\":137}";,编译器会自动在末尾加'\0'。
内容的提问来源于stack exchange,提问作者Shlomi Schwartz




