sprintf(target,source)对sprintf(target,“%s”,source)有不同的行为;

时间:2013-04-24 09:07:09

标签: c printf

在特定PlayStation平台附带的C / C ++编译器上,我对非标准ASCII字符感兴趣(用于翻译语言,如西班牙语 - 严重,急性,那种事情)

char target_string[MAX_STRING_LENGTH];
char string_table[][MAX_STRING_LENGTH];

如果我使用

sprintf( target_string, string_table[N] ); 

其中源字符串包含ascii值大于127的字符(即在signed char中低于0),复制的字符串包含非标准的ascii字符,但不包含字符串中的字符。第一个带重音的欧洲字符是sprintf语句放弃的地方,就好像比较是if(char <= 0),完成。

如果我使用

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

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

这是sprintf的一个已知功能吗? - 即我不应该使用没有格式说明符的sprintf(目标,源)版本,因为它不是函数的有效使用 - 在这种情况下为什么编译器没有警告?或许索尼正在使用的略微修改的编译器是原因。似乎不太可能。

1 个答案:

答案 0 :(得分:2)

如果你打电话

sprintf( target_string, string_table[N] );

然后string_table [N]将被解释为“格式字符串”(如果其中有'%',您的应用程序将会死得很厉害。不要这样做)

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