在 C 中的字符串中放置大括号

问题描述 投票:0回答:1

我正在使用 C 的 JSON 解析器。JSON 请求需要大括号。我正在尝试将用户输入插入 JSON 请求字段之一。为此,我有一个变量存储请求的前半部分,一个变量用于用户输入,一个变量用于存储 JSON 请求的其余部分。我使用

snprintf
将变量组合在一起。我似乎无法通过最后一个花括号。

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

    char *test = "{\"UPSSecurity\": {\"UsernameToken\": {\"Username\": \"[email protected]\",\"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": "[email protected]","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"
   }
 }
c json string printf ansi-c
1个回答
2
投票

你的尺寸

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
,别忘了
free
它。

您还应该确保输入

trackingnum
的金额不超过它能够容纳的金额。

© www.soinside.com 2019 - 2024. All rights reserved.