- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在我的 C 应用程序中使用 ISO 8859-1(拉丁语扩展 ASCII 字符集)。当我将 strcpy
/strcat
字符串的部分放在一起时,它工作正常。但是当我使用 sprintf("%s %s")
时,在某些运行时(特别是某些版本的 Android),当扩展 ASCII 字符(特别是 é
,虽然我没有尝试过其他)被击中。
我以为 %s
只是应该复制字节,直到 '\0'
被命中。我怀疑 strcpy
/strcat
可以工作,因为它确实做到了这一点,没有任何格式。这里可能发生了什么?
我应该注意,我不是使用 printf()
查看文本,而是我自己的文本渲染引擎可以很好地处理 ISO-8859-1。
更新:澄清一下,我有一个 NDK 应用程序,它将字符串保存在 C 中,并将其传递给我基于 OpenGL 的文本渲染引擎。如果我将完整的字符串作为 char* 文字传递,它会正常显示。如果我 sprintf() 将这些部分放在一起,它会在 é 字符处被截断。例如:
char buffer[1024];
strcpy(buffer, "This is ");
strcat(buffer, "the string I want to diésplay.");
这显示很好。但是这个:
sprintf(buffer, "%s%s", "This is ", "the string I want to diésplay.");
打印为:
This is the string I want to di
最佳答案
s[n]printf()
的行为与 strcpy()
和 strcat() 等字符串操作函数的行为不同
。 printf
系列函数都需要在呈现相同格式和打印项目时生成相同的字节序列。唯一的区别在于这些字节的发送位置。因此,如果您的 C 库构建为在通过 printf()
打印到标准流时对字符串数据执行转换(可能是转码),那么它会在打印到通过 sprintf()
的字符串。
“printf”中的“f”代表“格式化”。该标准既没有说明也没有暗示格式化字符串必须意味着将其字节逐字转储到输出,因此我上面假设的转码或其他转换并非不可能。事实上,the docs for some versions of these functions指示语言环境依赖性(“请注意,生成的字符串的长度取决于语言环境且难以预测”),因此特别是转码是一种真正的可能性。
对您描述的第三方观察的任何具体解释都必然是推测性的,因为您没有提供足够的代码或数据来做出自信的诊断。我倾向于怀疑围绕在使用与程序内部使用的字符编码不同的字符编码的语言环境中运行程序的问题。如果是这样,那么您可以通过改变您运行的语言环境来在本地重现该问题,并且您可以通过确保您的程序始终在合适的语言环境中以某种方式运行来解决该问题。除此之外,您还可以使用 getlocale()
和 setlocale()
函数来提供帮助,特别是如果您想要限制执行区域设置控制的范围。
由于最终您仅依赖 printf 系列函数进行字符串操作,因此我认为最好使用问题中提供的解决方法:尽可能多地使用 C 的专用字符串操作函数,例如strcpy()
和 strncat()
,执行字符串构建。由于您的实际输出不依赖于 stdio 函数,所以这应该没问题。
关于android - sprintf() 在某些运行时处理 %s 扩展 ASCII (ISO 8859-1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35065376/
将一些代码从 sprintf 移动到 snprintf -偶然发现了这个奇怪的事件: sprintf(buf+strlen(buf), "ypasZ%c%c", iItem, val); 我不明白那里
在特定 PlayStation 平台附带的 C/C++ 编译器上,我对非标准 ASCII 字符(在翻译语言中使用,例如西类牙语 - 严肃、尖锐,诸如此类)有些困扰 char target_string
有printf。它直接打印到标准输出。 sprintf 怎么样,它的格式和 printf 一样,但是返回一个没有副作用的字符串? 最佳答案 在 Clojure 中,它被称为 format并驻留在 cl
我正在使用字符数组[6];我正在使用 sprintf 将浮点变量转换为字符串,如下所示.. sprintf(array,"%f\0",floatvar); 我正在 LCD 上写入字符数组。 问题是我的
我过去在我的代码中多次使用过这种约定: strcpy ( cTmpA, "hello" ); sprintf ( cTmpA, "%s world", cTmpA ); 最近我将旧的 C 编译器切换到
任何人都可以指出一个源代码文件或一个在 C 中具有良好、可重用的 sprintf() 实现的包,我可以根据自己的需要对其进行自定义吗? 关于我为什么需要它的解释:字符串在我的代码中不是空终止的(二进制
我有一个匹配字符串占位符的数组,如下所示: "some text %s another text %s extra text %s" 和数组: $array[0] match the first %s
我正在尝试实现以下(没有 sprintf 或格式化): void integer_to_string(unsigned int a, char *string) { char arr[
我不明白为什么会这样: Printf.sprintf "%08s" "s" = Printf.sprintf "%8s" "s" - : bool = true 换句话说,我希望: Printf.sp
让我们做一些四舍五入 > round(-0.001, 2) [1] 0 我收到零。 现在结合 sprintf > sprintf("%f", round(-0.001,2)) [1] "-0.0000
我正在尝试以编程方式将字符串宽度值插入 sprintf()格式。 想要的结果是 sprintf("%-20s", "hello") # [1] "hello " 但我想插入
这个问题在这里已经有了答案: How do I use the same parameter more than once? (2 个回答) 5年前关闭。 我使用 sprintf 函数如下: spri
我希望将定义的变量插入到 R 中的字符串中,其中变量将插入多个位置。 我见过sprintf可能有用。 所需输入的示例: a <- "tree" b <- sprintf("The %s is larg
在 中找到的字符串格式化概念sprintf 今天几乎可以在任何语言中找到(你知道,用 %s %d %f 等来扼杀一个字符串,并提供一个变量列表来填充它们的位置)。 哪种语言最初具有提供此功能的库函数或
这是我的代码的一部分 int pic_num = 1; printf("pic_num = %i\n", pic_num); sprintf(picture, "%03d.jpg", pic_num)
为什么会出现这种行为? # Printf.sprintf ("Foo %d %s") 2 "bar";; - : string = "Foo 2 bar" # Printf.sprintf ("Foo
我有这样的SQL查询 if (isset($_POST['no_peserta_mhs_2015'])) { $colname_rec_mhs_2015 = $_POST['no_peserta_mh
我正在尝试使用 F# 交互式控制台打印一个 int。 let x = sprintf "%d", 3 printf x 给出: stdin(12,8): error FS0001: The type
这是一个简单的问题 我需要在 sprintf 函数中复制值 sprintf("%s %s %s",$arg1,$arg1,$arg2); 我怎样才能只传递$arg1一次?似乎无法在 php.net 上
这是一个错误吗? > nchar(sprintf("%-20s", "Sao Paulo")) [1] 20 > nchar(sprintf("%-20s", "São Paulo")) [1] 19
我是一名优秀的程序员,十分优秀!