2012-02-14 25 views
4

我對着下面的代碼:我可以在C字符串中使用什麼值?

char buf[100]; 
char buf2[100]; 
strcpy(buf, "áéíóúç"); 
sprintf(buf2, "%s", buf); 

,我想知道,如果它的正確與否。我已經在Windows和Linux中測試過它,它確實有用,但它是否可以在所有不同語言的操作系統/平臺上運行?

兩個strcpysprintf預計由null字符終止的C-字符串,而是可以在C-字符串的內容是任意的(不包括null字符)?

它是確定也做這樣的事情:

strcpy(buf, "\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00"); 
sprintf(buf2, "%s", buf); 

回答

3

char數組只是一個字節數組,而所有非寬字符串函數都是在這個假設下操作的。通常唯一具有特殊含義的字節是空字節。據我所知,C標準在字符編碼(或一般文本)這個主題上沒有太多的話要說,所以你的程序必然會在預期輸出字符的平臺上失敗編碼與您的代碼不匹配。

2

這個問題是在適當位置,但:

字符串功能停止僅在NULL字符,爲c-string的定義是空終止字節的緩衝區。所以你的例子是好的。

1

是的。 *

*)但請注意,第二個示例將是一個字符短,\0字符指示字符串的結尾,因此不會被打印。

2

char是機器中最小的可尋址單元。在今天使用的任何東西中,將會是8位或一個字節。你可以把任何東西放在裏面,用8位整數表示。

在處理字符集時,集,每個字符使用16位(字符集中的字符)。在這種情況下,如果您沒有意識到這一點,並且您的緩衝區太小而無法保存數據,則會出現問題。

推薦閱讀:http://www.joelonsoftware.com/articles/Unicode.html

1

幾乎總是,你的代碼將工作。

但是,我看到了兩個可能的小問題:

  1. 一些舊的C編譯器可能不接受ASCII之外的C源代碼 - 對陌生的大型機或許EBCDIC - 字符(所以強調字符可能是不歡迎,即使在字符串和評論中)。
  2. 即使在最近的Linux系統上,您也可以使用UTF8編碼進行編譯,但您的可執行文件將使用不同的編碼(例如ISO8859-1)和本地化進行編譯。

實際上,由於最近的GCC編譯器接受UTF8,而且大多數Linux都是UTF8,所以這些問題在今天很小。我不會在練習中打擾。

也許瞭解國際化和gettext等。可能有用

相關問題