在C中把花括号放在字符串中

在C中把花括号放在字符串中,c,json,string,printf,ansi,C,Json,String,Printf,Ansi,我将JSON解析器与C一起使用。JSON请求需要大括号。我正在尝试将用户输入插入其中一个JSON请求字段。为此,我有一个存储请求前半部分的变量、一个用于用户输入的变量和一个用于JSON请求其余部分的变量。我使用snprintf将变量组合在一起。我好像没法穿上最后一条卷发 const char *open_brace = "}}"; char buf[306]; char trackingnum[18]; char *test = "{\"UPSSecurity\":

我将JSON解析器与C一起使用。JSON请求需要大括号。我正在尝试将用户输入插入其中一个JSON请求字段。为此,我有一个存储请求前半部分的变量、一个用于用户输入的变量和一个用于JSON请求其余部分的变量。我使用
snprintf
将变量组合在一起。我好像没法穿上最后一条卷发

const char *open_brace = "}}";
    char buf[306];  
    char trackingnum[18];

    char *test = "{\"UPSSecurity\": {\"UsernameToken\": {\"Username\": \"xxxxxxxx@xxxxxx.edu\",\"Password\": \"xxxxxxxxxxxxxxxx\"},\"ServiceAccessToken\": {\"AccessLicenseNumber\": \"8D421B74FBC948C8\"}},\"TrackRequest\": {\"Request\": {\"RequestOption\": \"1\",\"TransactionReference\": {\"CustomerContext\": \"\"}},\"InquiryNumber\": \"";
    char ending[10] = "\"}}";
    strcat (ending, open_brace);

    printf("\nEnter a tracking number: ");
    scanf(" %s",trackingnum);
    printf("\nTracking num is: %s\n",trackingnum);

     snprintf(buf, sizeof(buf), "%s%s%s%s", test, trackingnum, ending, open_brace );

    printf("\nBuf is: %s\n\n\n\n",buf);
    char *postthis = buf;
输出:

Enter a tracking number: 1ZY5841YYW90351446

Tracking num is: 1ZY5841YYW90351446

Buf is: {"UPSSecurity": {"UsernameToken": {"Username": "xxxxxxxx@xxxxxx.edu","Password": "xxxxxxxxxxxxxxxx"},"ServiceAccessToken": {"AccessLicenseNumber": "8D421B74FBC948C8"}},"TrackRequest": {"Request": {"RequestOption": "1","TransactionReference": {"CustomerContext": ""}},"InquiryNumber": "1ZY5841YYW90351446"}




{"Error":{"Code":"4","Description":"JSON Syntax error"}}
jobj from str:
---
{
   "Error": {
     "Code": "4",
     "Description": "JSON Syntax error"
   }
 }

您的大小
buf
不正确。由于您使用的是
snprintf
,因此它会截断您输入的文本,以使其适合可用空间

更好的方法是使用
malloc
,这样就可以为
buf
指定正确的大小,如下所示:

char *buf = malloc(strlen(test) + strlen(trackingnum) + strlen(ending) + strlen(open_brace)+1);
sprintf(buf, "%s%s%s%s", test, trackingnum, ending, open_brace );
然后还可以使用
sprintf
,因为您知道字符串的组合长度加上NUL字符的额外空间是合适的

一旦你使用了
buf
,别忘了
释放它


您还应确保输入到trackingnum的金额不超过它所能容纳的金额。

您的大小
buf
不正确。由于您使用的是
snprintf
,因此它会截断您输入的文本,以使其适合可用空间

更好的方法是使用
malloc
,这样就可以为
buf
指定正确的大小,如下所示:

char *buf = malloc(strlen(test) + strlen(trackingnum) + strlen(ending) + strlen(open_brace)+1);
sprintf(buf, "%s%s%s%s", test, trackingnum, ending, open_brace );
然后还可以使用
sprintf
,因为您知道字符串的组合长度加上NUL字符的额外空间是合适的

一旦你使用了
buf
,别忘了
释放它



您还应该确保输入到trackingnum的金额不超过它所能容纳的金额。

您能给我们看一些代码吗,然后告诉我们您预期会发生什么,以及正在发生什么?使用output和code编辑打开和关闭大括号在buf中不匹配。一旦我使用snprint f添加结尾,它们应该
char trackingnum[18]只能容纳17个字符,但您可以输入18个字符。终止的nul字符可能会影响相邻的变量。您能给我们看一些代码,告诉我们您预期会发生什么以及正在发生什么吗?使用output和code编辑打开和关闭的大括号在buf中不匹配。一旦我添加了以snprint f结尾的字符,它们应该
char trackingnum[18]只能容纳17个字符,但您可以输入18个字符。终止nul字符可能会影响相邻变量。@Gerhardh确定吗?我把这个字符串复制到一个编辑器中,总共有305个字符。我刚把它们改成buf[350]和trackingnum[19]@ChrisTurner:哪个字符串
buf
仅为287,
test
比源代码字符串短,因为
\“
是一个字符。啊……看起来当我输入答案时,问题被更新了,
buf
的内容被修改为隐藏用户名&password@CryptoCat:如果要更改代码以隐藏敏感数据,您至少需要使用相同数量的字符-您的问题现在不再显示问题,因为它不是您正在运行的代码。这是一种糟糕的形式。但是敏感数据仍然存在-我们都可以查看编辑历史-您可能需要更改密码。。。还有你的学校@葛哈德,你确定吗?我把这个字符串复制到一个编辑器中,总共有305个字符。我刚把它们改成buf[350]和trackingnum[19]@ChrisTurner:哪个字符串
buf
仅为287,
test
比源代码字符串短,因为
\“
是一个字符。啊……看起来当我输入答案时,问题被更新了,
buf
的内容被修改为隐藏用户名&password@CryptoCat:如果要更改代码以隐藏敏感数据,您至少需要使用相同数量的字符-您的问题现在不再显示问题,因为它不是您正在运行的代码。这是一种糟糕的形式。但是敏感数据仍然存在-我们都可以查看编辑历史-您可能需要更改密码。。。还有你的学校!