You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C语言中从char[]拼接字符串返回错误值问题咨询

嘿,我帮你分析下这个问题哈——你用strcat逐个拼接字符时最终结果异常,核心是没搞懂C语言字符串的终止规则和strcat的工作逻辑,咱们来一步步理清楚:

为啥会出问题?主要俩原因

(1)data数组缺了字符串终止符'\0'

你声明的static char data[] = {'{','"','x','"',':',...}是纯字符数组,末尾没加'\0'。C语言里所有字符串操作函数(比如strcatprintf("%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

火山引擎 最新活动