我正在使用jsmn JSON parser(source code)從JSON獲取一些文本。 jsmn將數據存儲在令牌中,但令牌不包含任何數據,它們只是指向JSON字符串中的令牌邊界。例如,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就是Wo ULD被扔進解析器:
{"status":0,"id":"432eac38858968c108899cc6c3a4bade-1","hypotheses":[{"utterance":"test","confidence":0.84134156}]}
{"status":5,"id":"695118aaa3d01dc2ac4aa8054d1e5bb0-1","hypotheses":[]}
一旦通過第一示例JSON該方法,我得到的「測試」的預期值從方法返回。但是,在將空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
你真的想通過'&賈森[..]''到memcpy'? –
@UchiaItachi在該方法中沒有'memcpy' ... – syb0rg
在循環中放置一個'printf()'語句來打印'(key-> start)'和'(key-> end - key - > start)'in hex(ie:'printf(「0x%08X」,val)'。我傾向於輸入字符串'json',比預期的要短,並且傳遞了一個無效指針 – DevNull