首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当格式包含非ASCII字符时,sprintf不工作。

当格式包含非ASCII字符时,sprintf不工作。
EN

Stack Overflow用户
提问于 2016-02-12 03:14:52
回答 1查看 763关注 0票数 2

以下对sprintf的调用在为i386 arch编译时失败。使用Android。我试过用GCC和clang编写,结果是一样的。我使用的是android-ndk-r10e ( APP_STL和GCC一起设置为gnustl_sharedc++_shared设置为clang)。它的工作原理是(我?)当我用相同的配置为ARM编译时,以及当我用GCC 5.2为i386 Linux编译时,我打算这样做。

代码语言:javascript
运行
复制
int n = sprintf(buf, "\xc0%s", "test"); // n == 0, strlen(buf) == 0

调用之后,buf是空的,而不是包含预期的char序列"\xc0test“。sprintf似乎忽略了第一个非ASCII字符之后的所有内容.以下代码将“测试”写入buf,省略了最后一个字节:

代码语言:javascript
运行
复制
sprintf(buf, "%s\xc0", "test"); // strlen(buf) == 4

另一方面,这也很好:

代码语言:javascript
运行
复制
sprintf(buf, "%s", "test\xc0"); // strlen(buf) == 5

我很困惑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-12 08:02:59

这是众所周知的Android问题。问题在于Android的实现(Bionic),它在符合标准方面相当不完整。特别是,Bionic实现不能正确地支持非ASCII字符。

这个简单的测试在由Android r10e构建时输出strlen(buf)=4

代码语言:javascript
运行
复制
#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构建,上面的示例可以正常工作:

代码语言:javascript
运行
复制
strlen(buf)=5
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35354221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档