【发布时间】: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 一样。谢谢!