【发布时间】:2017-05-03 07:37:40
【问题描述】:
我有一个选择和提取 JSON 行的函数。该 JSON 行将在另一个函数中计算,该函数应该提取它的值。
"key" : "value",
我希望在不使用任何用于操作 JSON 的库的情况下提取 值。
到目前为止,我的代码如下所示:
char* extractValueInLine(char* line) {
if(!verifyLine(line)) // Checks wether line contains 4 quotes or not
return "";
int len = strlen( line );
char* res = NULL;
unsigned quoteCpt = 0;
for (unsigned i = 0; i < len; i++){
if (line[i] == '\"')
quoteCpt++;
if (quoteCpt == 3) // If 3 quotes has been skipped
{
res = malloc((char) sizeof(res) + sizeof(char)); // Adding memory for one char
if (NULL == res)
fprintf(stderr, "Not enough memory.\n");
else
{
char toAppend[2];
toAppend[1] = '\0';
toAppend[0] = line[i];
strcat(res, toAppend); // Append current char
}
}
return res;
}
因为输出是空白而不是 value,所以这非常难看而且根本没有效率。
尽管如此,我已经尝试了越来越多的方法来做到这一点,使用字符串库函数以及 sscanf、strtok 和其他东西,但它要么不起作用,要么很容易被破坏。
即使添加或缺少空格也可以工作的代码将是完美的。
如果有人可以建议我或告诉我我在这里缺少什么。
【问题讨论】:
-
你为什么不使用一些库?或者它是某些任务的一部分?
-
malloc((char) sizeof(res) + sizeof(char))看起来很可疑。sizeof(res)是指针的大小,而不是要包含在那里的字符串。你应该使用类似malloc(len-i+1)的东西。 -
len 包含参数 line 的大小,该大小大于 res 应有的大小。我想要的是通过迭代为当前的 char 迭代添加内存。另外,不使用库确实是作业的一部分,因为我的 JSON 相关代码很少,而且似乎不值得使用。
-
JSON 的好处之一是自动反序列化。 js、java 和 C# 等高级语言通过反射(自动计算出类和属性名称)来处理这个问题。如果没有一大堆包装宏,用 C 实现会非常难看。
-
不返回"",而是返回NULL。