2013-11-09 121 views
0

我正在寫使用C.帶我想做的事情得到一個子,我已經寫了一個簡單的C代碼,它的一個普通舊工作的Android本機應用程序的結束。這是代碼:奇怪的字符(0010)在字符串

char* get_part_allocated(const char* src, int start, int len) 
{ 
    LOGI("copying [%s] from [%d] len [%d]\n", src, start, len); 
    int nlen = len+1; 
    char* alloc = (char*)malloc(nlen*sizeof(char)); 
    strncpy(alloc, src+start, len); 
    LOGI("result is: [%s]\n", alloc); 
    return alloc; 
} 

當我編譯和運行在PC這個代碼,我得到預期的結果,但是當我在Android上運行它,它總是在最後一個奇怪的字符,其破壞的流我程序並導致錯誤!

這是logcat的輸出截圖: enter image description here

我想填充更多的空值,2或甚至3,但並沒有改變任何東西!

是否有人知道它是什麼,以及如何才能擺脫呢?

回答

2

無論alloc也不strncpy零出新分配的內存。您需要在新字符串的末尾手動添加零。

可能是您在桌面上以調試模式運行此操作,並且大量編譯器以調試模式(僅)調出新分配的內存。

它所需要的是這樣的附加線路:

alloc[len] = 0; 

注意:您不需要/用C不該投的malloc:Do I cast the result of malloc?

+0

糟糕!同樣的錯誤不會阻止開發人員:D謝謝。 – Mousa

+0

謝謝你的提示,但ndk在我不轉換它時給出了一個錯誤:「在函數'char * get_part_allocated(char const *,int,int)'中:錯誤:從'void *'無效轉換爲' char *'[-fpermissive]「我認爲這可能是ndk使用C++編譯器,對吧? – Mousa

+1

正確,在C中強制轉換是可選的(並且不必要),但對於C++強制轉換。這可能意味着,你正在編譯你的.c文件,就好像它是.cpp文件一樣。正如你所看到的,它有這種相對無害的副作用,但可能有其他的。檢查您是否可以強制編譯器將.c和C++用於.cpp文件。 – usr2564301

1

原因是strncpy()函數犯規NULL終止目標字符串,所以你的代碼應該如下所示。

strncpy(alloc, src+start, len); 
alloc[len]='\0' ; 

這應該可以解決您的問題。

+0

謝謝薩加爾,是的,這是問題,因爲我誤解了文檔,並認爲功能會爲我做。 – Mousa