gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:40:13 25 4
gpt4 key购买 nike

我将 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

非常感谢任何帮助。

最佳答案

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

缓冲区[计数] = '\0';

关于C 字符串有随机尾随字符、空终止问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46760452/

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