2013-04-24 77 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