C字符串詳解

1、C字面值字符串類型(本條針對於C99):
     以下三個字符串是不同的:
           “XXXXXX”
            (char []){"XXXXXX"}
            (const char []){"XXXXXX"}
第一個總是有一個靜態存儲期,並且類型爲char型的數組,不能被修改。後兩個如果他們出現在一個函數體中時,有一個自動存儲期;且這兩個中的第一個是可以修改的。其中,這三個字符串的類型都是char[7],其中後兩個是C99標準中增的語法。

最佳實踐:對於C99,當在一個函數中使用不可以修改的常量字符串時,應儘量使用第三種,因爲當出了他的作用域(即不在使用它)時,該字符串所佔用的空間將被釋放;而如果用第一種的話,它是靜態的,它的空間在程序被編譯時分配,程序結束時釋放,這樣在不用它時浪費了存儲空間。當然,對於C89(或稱爲C90)、C95(C90的修訂案1)而言,只能用第一種形式了。

2、C語言中字符串比較時的陷阱
儘管我們可以使用諸如"abc" == "abc"方式來判斷兩個字符串是否相等,但我們不應該“偷懶“而依賴這種方式。
原因:字符串在C中被解釋爲字符數組,而字符數組的數組名又可以被解釋爲指針,所以當兩個常規的字面字符串用“==”來進行比較時,相當於比較的是兩個字符數組的地址;而爲什麼我們比較的時候會是相同的呢?這是因爲,編譯器可能會共享這些相同的字面字符串,即對這些字面字符串的使用其實是同一個字符串(換句話說就是,比較的是同一個內存的地址值),儘管不是我們的本意;但是,要注意,C標準並沒有要求所有的編譯器這麼做,只是說明編譯器可以這麼做(有的編譯器可能會給出警告),但我們不能信賴於此。相反,我們應該使用標準庫函數strcmp或strncmp、wcscmp或wcsncmp(對於寬字符)等等;當然,你願意的話也可以編寫自己的庫函數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章