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

C语言拼接JSON字符串时最后大括号无法正常输出的问题

解决C语言中snprintf拼接JSON时末尾大括号无法正常输出的问题

嘿,我懂你这会儿的糟心——用snprintf拼JSON,结果最后那对大括号死活不出来,确实挺挠头的。咱们一步步拆解问题,把它搞定:

可能的核心原因

你遇到的问题大概率逃不出这几个情况:

  • 缓冲区buf尺寸不够,snprintf直接截断了末尾的大括号内容
  • JSON拼接的顺序或结构不完整,大括号的位置没放对
  • 没处理好JSON的引号转义,导致整体结构混乱

具体解决方案

1. 先把缓冲区搞够大

你定义的buf[306]可能太小了!如果前半段JSON(test)+ 用户输入(trackingnum)+ 末尾大括号的总长度超过306,snprintf就会自动截断内容,自然看不到最后的大括号。建议直接把缓冲区调大,比如buf[512]甚至buf[1024],先避开截断问题。

2. 按正确的JSON结构拼接

要保证拼接后的JSON是完整的,每个开括号对应闭括号。比如你的test应该是JSON的前半部分,刚好到TrackingNumber字段的引号位置,插入用户输入后,再补上闭合的引号和所有剩余的大括号。

给你写个完整的示例代码参考:

#include <stdio.h>
#include <string.h>

int main() {
    // 前半段JSON:到TrackingNumber字段的开头引号位置
    const char *json_prefix = "{\"UPSSecurity\":{\"UsernameToken\":{\"Username\":\"your_user\",\"Password\":\"your_pass\"},\"ServiceAccessToken\":{\"AccessLicenseNumber\":\"your_license\"}},\"TrackRequest\":{\"Request\":{\"RequestAction\":\"Track\",\"RequestOption\":\"1\"},\"TrackingNumber\":\"";
    char trackingnum[18]; // 存用户输入的追踪号
    const char *json_suffix = "\"}}}"; // 闭合TrackingNumber的引号+所有剩余大括号
    char buf[512]; // 足够大的缓冲区

    // 模拟用户输入追踪号
    strcpy(trackingnum, "1Z999AA10123456784");

    // 拼接完整JSON
    int result_len = snprintf(buf, sizeof(buf), "%s%s%s", json_prefix, trackingnum, json_suffix);

    // 检查是否被截断
    if (result_len >= sizeof(buf)) {
        printf("警告:缓冲区不够,JSON内容被截断啦!\n");
        return 1;
    }

    // 输出最终JSON
    printf("生成的完整JSON:\n%s\n", buf);
    return 0;
}

3. 一定要检查snprintf的返回值

snprintf会返回如果缓冲区足够大时应该生成的字符串总长度,如果这个值大于等于你定义的缓冲区大小,说明内容被截断了,这时候必须调大缓冲区尺寸。

4. 验证JSON结构完整性

拼接完后,可以把输出的JSON复制到本地的JSON校验工具里(不用跳网站),检查有没有语法错误,确保所有大括号、引号都是配对的。

额外提醒

如果用户输入的trackingnum包含特殊字符(比如引号、反斜杠),还得做转义处理,不然会直接破坏JSON结构——不过UPS追踪号一般都是字母数字,暂时可能不用,但最好留个心眼。

内容的提问来源于stack exchange,提问作者CryptoCat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:08:58