在 C 中将大括号放在字符串中
Putting Curly braces in a string in C
我在 C 中使用 JSON 解析器。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
,因此它会截断您输入的文本,以使其适合可用的 space.
更好的方法是使用 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 字符的额外 space 将适合。
完成 buf
后,别忘了 free
它。
您还应确保输入 trackingnum
的金额不超过其承受能力。
我在 C 中使用 JSON 解析器。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
,因此它会截断您输入的文本,以使其适合可用的 space.
更好的方法是使用 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 字符的额外 space 将适合。
完成 buf
后,别忘了 free
它。
您还应确保输入 trackingnum
的金额不超过其承受能力。