C字符串有随机尾随字符,以空值终止的问题?

时间:2017-10-15 22:02:02

标签: c json string cjson

我将cJSON与JNI结合使用,在我的Java和C组件之间来回传递JSON数据。

我是C的新手并自学,所以请耐心等待。

cJSON有一个很好的函数cJSON->Print,它将JSON结构转换为字符串表示形式。这很棒,除了字符串在" JSON Pretty"格式,所有换行符和制表符都保持不变。我不需要任何这些,因为我的应用程序不显示JSON,它只是用它来进行数据传输。所以,我试图写一个能删除多余字符的函数。

void json_clean(char *buffer, const char *pretty) {
    int count = 0;
    for(int i = 0; i < strlen(pretty); i++) {
        if(pretty[i] == '\n' || pretty[i] == '\t')
            continue;

        buffer[count] = pretty[i];
        count++;
    }

    int last = strlen(buffer) - 1;
    buffer[last] = '\0';
}

这有效地删除了\n\t字符,但有时最后我会收到一些垃圾字符,例如6?,这会导致我认为这是一个空终止问题。

在C语言中使用printf并在Java中打印出来时,字符串的出现方式相同。

在调用函数之前,我确保为NUL字符分配比我需要的字节多一个字节:

// get the pretty JSON
const char *pretty = cJSON_Print(out);

// how many newlines and tabs?
int count = 0;
for(int i = 0; i < strlen(pretty); i++) {
    if(pretty[i] == '\n' || pretty[i] == '\t')
        count++;
}

// make new buffer, excluding these chars
char *newBuf = malloc((strlen(pretty) - count) + 1); // +1 for null term.
json_clean(newBuf, pretty);

// copy into new Java string
jstring retVal = (*env)->NewStringUTF(env, newBuf);
free(newBuf); // don't need this anymore

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

解决方案是手动设置空字符的索引,而不是依靠strlen来计算最后一个索引(它只查找空字符)。如果缓冲区中没有空字符,strlen不会产生有用的结果。

buffer[count] = '\0';