2016-02-12 99 views
1

編譯爲i386 arch時,以下調用sprintf失敗。使用Android NDK。我試着用GCC和clang編譯,結果是一樣的。我正在使用android-ndk-r10e(將APP_STL設置爲gnustl_shared與GCC,c++_shared與clang一起)。它的工作原理如下(I?)用於爲具有相同配置的ARM進行編譯時使用,此外,當我使用GCC 5.2編譯i386 Linux時。當格式包含非ASCII字符時,sprintf不起作用

int n = sprintf(buf, "\xc0%s", "test"); // n == 0, strlen(buf) == 0 

通話結束後,buf是空的,而不是含有期望的字符序列「\ xc0test」。 sprintf似乎忽略了第一個非ASCII字符後的所有內容。下面的代碼將「測試」 buf,留下的最後一個字節:

sprintf(buf, "%s\xc0", "test"); // strlen(buf) == 4 

在另一方面,這工作得很好:

sprintf(buf, "%s", "test\xc0"); // strlen(buf) == 5 

我茫然不知所措。

回答

2

這是已知的Android問題。這個問題存在於Android libc實現(仿生)中,在符合標準方面相當不完善。特別是,仿生stdio實現不能正確支持非ASCII字符。

這個簡單的測試打印strlen(buf)=4當由Android NDK r10e正在興建

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char buf[256]; 
    sprintf(buf, "%s\xc0", "test"); 
    printf("strlen(buf)=%d\n", strlen(buf)); 
    return 0; 
} 

解決方法:使用CrystaX NDK - 在谷歌的Android NDK,這裏的問題是固定的替代叉。上述示例如果由CrystaX NDK 10.3.1構建,則可以正常工作:

strlen(buf)=5 
+0

這對我來說非常合適。我看到你是CrystaX的創造者,所以非常感謝你。 'stdlib.h'不包含'labs',但這是微不足道的修復。 – user1421750

+0

嗯,實際上'stdlib.h'包含'labs'定義。如果您遇到問題,請隨時在我們的問題跟蹤器上提交一個最小可重現案例的錯誤 - https://tracker.crystax.net/projects/ndk。 –

相關問題