gpt4 book ai didi

c - 为什么此方法会抛出段错误?

转载 作者:太空狗 更新时间:2023-10-29 17:23:45 25 4
gpt4 key购买 nike

我正在使用 jsmn JSON parser ( source code ) 从 JSON 中获取一些文本。 jsmn 将数据存储在 token 中,但 token 不包含任何数据,它们只是指向 JSON 字符串中的 token 边界。例如,jsmn 将创建如下标记:

  • 对象 [0..31]
  • 字符串 [3..7]、字符串 [12..16]、字符串 [20..23]
  • 编号 [27..29]

此方法用于检索这些值之间的实际字符(对于字符串对象):

char* getTextFromJSON(const char *json)
{
if (!json) return NULL;

json_parser p;
#define N_TOKENS 15 // this normally would be at the start of the file
jsontok_t tokens[N_TOKENS];

initJsonParser(&p);
int err parseJson(&p, json, tokens, N_TOKENS);
if (err) {
fprintf(stdout, "Error parsing JSON: %d\n", err);
return NULL;
}
for (int i = 0; i < N_TOKENS; ++i) {
jsontok_t *key = &tokens[i];
if (!memcmp("utterance", &json[key->start], (size_t) (key->end - key->start))) {
++key;
return strndup(&json[key->start], (size_t)(key->end - key->start));
}
}
return NULL;
}

以下是一些将被放入解析器的 JSON 示例:

  • {"status":0,"id":"432eac38858968c108899cc6c3a4bade-1","hypotheses":[{"utterance":"test","confidence":0.84134156}]}
  • {"status":5,"id":"695118aaa3d01dc2ac4aa8054d1e5bb0-1","hypotheses":[]}

将第一个示例 JSON 传递给该方法后,我得到了从该方法返回的“test”的预期值。但是,在将空 JSON 传递给该方法后,我在条件 if 语句的 for 循环的第 8 次迭代中遇到了段错误。

有什么建议吗?

这是十六进制值:

key->start: 0x00000000
key->end - key->start: 0x00000046
key->start: 0x00000002
key->end - key->start: 0x00000006
key->start: 0x0000000A
key->end - key->start: 0x00000001
key->start: 0x0000000D
key->end - key->start: 0x00000002
key->start: 0x00000012
key->end - key->start: 0x00000022
key->start: 0x00000037
key->end - key->start: 0x0000000A
key->start: 0x00000043
key->end - key->start: 0x00000002
key->start: 0x3A7B3188
key->end - key->start: 0x7A0F0766

最佳答案

编辑查看源代码后...

for (i = parser->toknext; i < num_tokens; i++) {
jsmn_fill_token(&tokens[i], JSMN_PRIMITIVE, -1, -1);
}

它初始化所有结构,但 ->start 和 ->end 将等于 -1,这就是 memcmp 失败的原因。

for (int i = 0; i < N_TOKENS; ++i) {
jsontok_t *key = &tokens[i];
if (key->start == -1) return NULL;
if (!memcmp("utterance", &json[key->start], (size_t) (key->end - key->start))) {
++key;
return strndup(&json[key->start], (size_t)(key->end - key->start));
}
}

在 ->start 或 ->end 中检查 -1 值应该就足够了。

关于c - 为什么此方法会抛出段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18084503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com