2013-04-24 39 views
2

在特定的PlayStation平台附带的C/C++编译器中,我有一个非标准ASCII字符的麻烦点(用于翻译语言,如西班牙语 - 严重,尖锐,那种东西)sprintf(target,source)与sprintf(target,“%s”,source)有不同的行为;

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

如果我使用

sprintf(target_string, string_table[N]); 

其中源字符串包含一个字符与(在一个符号的字符即低于0)127以上的ASCII值被复制字符串包括非标准ASCII字符,但没有更多的字符来自字符串。第一个重音欧洲字符是sprintf语句放弃的位置,就好像比较是if(char < = 0),完成。

如果我使用

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

具有相同的字符串,整个事情正确复制,因为如果比较是,如果(字符== 0),然后完成。

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

+0

编译器不会发出警告,因为它不知道'string_table [N]的方式'是不是有效格式字符串。 – Medinoc 2013-04-24 09:24:44

+1

你是完全正确的 - 我没有意识到格式字符串不需要是字符串文字,而且也不需要是最终参数,因为当然格式字符串可以是一个有效的字符串,就像printf一样。谢谢! – 2013-04-24 09:35:09

回答

2

如果你打电话

sprintf(target_string, string_table[N]); 

然后string_table [N]将被解释为“格式字符串”(如果存在这一个“%”您的应用程序将可怕的死,不要做)

奇怪字符的问题是有关UTF-8,你应该使用的swprintf等wprintf-S

+0

啊!我明白了 - 现在有道理。第二个字符串有效地成为格式字符串,第三个参数(不存在)不是必需的参数。明白了 - 非常感谢! – 2013-04-24 09:26:06

+0

作为旁边不使用swprintf由于索尼的性质调用数据将最终在 - 如果支持存在将是首选选项 – 2013-04-24 09:27:48