我使用cJSON
與JNI結合在我的Java和C組件之間來回傳遞JSON數據。C字符串有隨機尾隨字符,空終止問題?
我是C新手,自學自學,請耐心等待。
cJSON
有一個不錯的功能,cJSON->Print
,它將JSON結構轉換成字符串表示。這很好,除了字符串是「JSON漂亮」格式,所有換行符和製表符都保持不變。我不需要其中的任何一個,因爲我的應用程序不顯示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
任何幫助是極大的讚賞。
要添加到@興的評論,問題是,'newBuf'沒有初始化,所以'strlen'通話讀取隨機數據和下車步行到區域的不應該。如果你在使用之前將內存置零,那麼你會很好,但@ xing的迴應是更好的解決方案。 – DocMax