2017-10-15 179 views
1

我使用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 

任何幫助是極大的讚賞。

+0

要添加到@興的評論,問題是,'newBuf'沒有初始化,所以'strlen'通話讀取隨機數據和下車步行到區域的不應該。如果你在使用之前將內存置零,那麼你會很好,但@ xing的迴應是更好的解決方案。 – DocMax

回答

0

解決方法是手動設置空字符的索引,而不是依靠strlen找出最後一個索引(它只查找空字符)。如果緩衝區中沒有空字符,則strlen不會產生有用的結果。

buffer[count] = '\0';

+0

「'strlen'將返回實際分配的緩衝區長度」 - 這是不正確的。 'strlen'將找到第一個nul字節的索引。如果緩衝區中沒有nul字節,'strlen'會高興地溢出緩衝區的末尾。 –

+0

@DietrichEpp修復了,謝謝 –