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

C string has random trailing characters, null-terminated issue?

我将 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] = '[=10=]';
}

这可以有效地删除 \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

非常感谢任何帮助。

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

buffer[count] = '[=12=]';