【问题标题】:Putting Curly braces in a string in C在C中将花括号放入字符串中
【发布时间】:2018-04-23 15:08:02
【问题描述】:

我正在使用带有 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 中的左大括号和右大括号不匹配。
  • 一旦我添加了 snprint f 他们应该的结尾
  • char trackingnum[18]; 只能容纳 17 个字符,但您输入 18。终止 nul 字符可能会影响您的相邻变量。

标签: c json string printf ansi


【解决方案1】:

您错误地设置了 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 的金额不超过它能够容纳的金额。

【讨论】:

  • @Gerhardh 你确定吗?我将字符串复制到编辑器中,结果为 305 个字符
  • 我只是把它们改成了 buf[350] 和 trackingnum[19]
  • @ChrisTurner :哪个字符串? buf 只有 287,test 比源代码字符串短,因为 \" 是一个字符。
  • 啊……看起来在我输入答案时,问题已更新,buf 的内容已更改为隐藏用户名和密码
  • @CryptoCat :如果要更改代码以隐藏敏感数据,则至少需要使用相同数量的字符-您的问题现在不再出现问题,因为它不是代码你在跑步。这是 SO 的错误形式。但是敏感数据仍然存在 - 我们都可以查看编辑历史记录 - 您可能想要更改密码......以及您的学校!
猜你喜欢
  • 2016-01-13
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 2023-01-29
  • 2011-10-30
  • 2018-12-11
  • 2019-08-25
  • 1970-01-01
相关资源
最近更新 更多