【问题标题】:sprintf(target, source) has different behaviour to sprintf(target, "%s", source);sprintf(target, source) 与 sprintf(target, "%s", source) 有不同的行为;
【发布时间】:2013-04-24 09:07:09
【问题描述】:

在特定 PlayStation 平台附带的 C/C++ 编译器上,我对非标准 ASCII 字符(用于翻译语言,如西班牙语 - 严重、尖锐之类的东西)感到有些困扰

p>
char target_string[MAX_STRING_LENGTH];
char string_table[][MAX_STRING_LENGTH];

如果我使用

sprintf( target_string, string_table[N] ); 

如果源字符串包含一个 ascii 值高于 127 的字符(即在有符号字符中低于 0),则复制的字符串包括非标准 ascii 字符,但字符串中没有更多字符。第一个重音欧洲字符是 sprintf 语句放弃的地方,就好像比较是 if(char

如果我使用

sprintf( target_string, "%s", string_table[N] ); 

使用相同的字符串,整个复制正确,好像比较是 if( char == 0 ) 然后完成。

这是 sprintf 的已知特性吗? - 即我不应该使用没有格式说明符的 sprintf( target, source ) 版本,因为它不是函数的有效使用 - 在这种情况下,为什么编译器没有警告?或者也许是索尼使用的稍微修改过的编译器是原因。似乎不太可能。

【问题讨论】:

  • 编译器不会发出警告,因为它无法知道string_table[N] 不是有效的格式字符串。
  • 你是绝对正确的-我是个笨蛋,因为我没有意识到格式字符串不需要是字符串文字,也不需要最终参数,因为当然,格式字符串本身可以是一个有效的字符串,就像 printf 一样。谢谢!

标签: c printf


【解决方案1】:

如果你打电话

sprintf( target_string, string_table[N] );

然后 string_table[N] 将被解释为“格式字符串”(如果其中有一个 '%',您的应用程序将可怕地死掉。不要这样做)

奇怪的字符问题是关于utf-8,你应该使用swprintf和其他wprintf-s

【讨论】:

  • 啊!我明白了——现在说得通了。第二个字符串有效地成为格式字符串,第三个参数(不存在)不是必需的参数。明白了 - 非常感谢!
  • 顺便说一句,由于 Sony 呼叫的性质,不使用 swprintf,数据最终会在 - 如果存在支持,将是首选选项
猜你喜欢
  • 1970-01-01
  • 2012-05-26
  • 2021-10-08
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 2017-02-13
  • 2014-09-20
  • 1970-01-01
相关资源
最近更新 更多