以下对sprintf
的调用在为i386 arch编译时失败。使用Android。我试过用GCC和clang编写,结果是一样的。我使用的是android-ndk-r10e
( APP_STL和GCC一起设置为gnustl_shared
,c++_shared
设置为clang)。它的工作原理是(我?)当我用相同的配置为ARM编译时,以及当我用GCC 5.2为i386 Linux编译时,我打算这样做。
int n = sprintf(buf, "\xc0%s", "test"); // n == 0, strlen(buf) == 0
调用之后,buf
是空的,而不是包含预期的char序列"\xc0test“。sprintf
似乎忽略了第一个非ASCII字符之后的所有内容.以下代码将“测试”写入buf
,省略了最后一个字节:
sprintf(buf, "%s\xc0", "test"); // strlen(buf) == 4
另一方面,这也很好:
sprintf(buf, "%s", "test\xc0"); // strlen(buf) == 5
我很困惑。
发布于 2016-02-12 08:02:59
这是众所周知的Android问题。问题在于Android的实现(Bionic),它在符合标准方面相当不完整。特别是,Bionic实现不能正确地支持非ASCII字符。
这个简单的测试在由Android r10e构建时输出strlen(buf)=4
:
#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的替代叉,那里的问题是解决的。如果由CrystaX NDK10.3.1构建,上面的示例可以正常工作:
strlen(buf)=5
https://stackoverflow.com/questions/35354221
复制相似问题