0

我从使用 Golang 编程开始,事情看起来很简单。然后我偶然发现了 C 的 JSON 解析器(JSMN),因此我可以尝试 CGO。

这是此示例中的代码行(1146):

static const char *JSON_STRING =
    "{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n  "
    "\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}";

printf("- User: %.*s\n", t[i+1].end-t[i+1].start, JSON_STRING + t[i+1].start);

这给了我结果:

“-用户:johndoe”

我是 C 新手。我想将值“johndoe”放入变量中。我尝试了下面的代码,它给了我NULL

int c = 0;
char sub[1000];
while (c < (t[i+1].end-t[i+1].start) ) {
    sub[c] = JSON_STRING[t[i+1].start+c-1];
    c++;
}
sub[c] = '\0';

输出:

“-用户:空”

我怎样才能做到这一点?谢谢!

4

1 回答 1

0

您可以使用strncpy()将所需的字符串复制到单独的变量中,因为您已经知道字符串的长度和起点,即:

t[i+1].end - t[i+1].start     // length of the string to copy
JSON_STRING + t[i+1].start    // starting point from where to start copying

例如:

const char*  strStart  = JSON_STRING + t[i+1].start;
const size_t strLength = t[i+1].end - t[i+1].start;

const size_t length = 8;      // required to store "johndoe"
char strCopy[ length ] = { 0 };

strncpy( strCopy, strStart, strLength );
// You might need to null terminate your string
// depending upon your specific use case.

JSMN 解析器存储标记的开始和结束位置。图书馆的用户需要在需要时使用这些位置制作副本。

%.*s格式说明符printf()将实际 C 样式字符串之前的字段宽度(要打印的字符串长度)作为参数。有关更多详细信息,请参阅

于 2018-09-23T06:17:11.823 回答