玩兒轉C語言 字元和字串

2021-07-25 17:49:42 字數 2364 閱讀 9879

**:

在c語言中,利用單引號和雙引號分別表示字元和字串,字串是指一串以nul位元組結尾的零個或多個字元。因為字串通常儲存在字元陣列中,所以c語言中不存在字串型別。但在使用時,如果不能真正理解兩者的本質區別,有可能會出現一些詭異的現象。下面我將通過實驗,進行詳細分析:

1、字元特性試驗,**如下:

[cpp]view plain

copy

print?

"font-size:18px;"

>

char

ch_1 = 

'a';  

char

ch_2 = 

'abcd'

;  int

ch_value_1 = 

'abcdef'

;  int

ch_value_2 = 

'abcd'

;  

分析:編譯器vs2010:第3行error c2015: 常量中的字元太多;第2行warning c4305: 「初始化」: 從「int」到「char」截斷。

當改為「int ch_value_1 = 'abc' ; 」後,系統錯誤消失。見下圖:

可以看到,ch_1的數值是0x61(a的ascii值),ch_2數值是0x64(d的ascii值),而且他們可以被當做整數進行運算。在給ch_2賦值的時候,編譯器就會用後邊字元數值替換前邊的數值,直到最後乙個。這只是vs2010的做法,其他編譯器是進行替換還是取第乙個有效字元,需要試驗論證。同時,ch_value_1的值是「abc」的ascii值組合,最高位元組用0填充;這就更能說明了字元本質是乙個整數。

但是也要看到第一次試驗失敗,編譯器並沒有把超過4個位元組的字元常量進行截斷處理(類似於處理0x1234567890一樣),因為它的空間占用超過了整型數的空間(32位)。整型數(32位)的儲存空間可以容納多個字元(8位),一次有的c編譯器允許乙個字元常量(或字串常量)中包括多個字元,故用『abcd』代替「abcd」有時不會報錯。「abcd」指:乙個含『a』、『b』、『c』、『d』和『\0』五個字元的連續唯讀空間的首位址;『abcd』一般沒有定義,大多數c編譯器認為:乙個整數值,由『a』、『b』、『c』、『d』所代表的ascii值按照編譯器定義的方式組合得到。

2、字串特性試驗,**如下:

分析:指標變數ch_ptr_1儲存的是字串「testchar」的首位址,如果在記憶體視窗輸入這個位址,可以看到該字串。

指標變數ch_ptr_2的值就是人為給賦予的,是字串行的ascii值,這再次印證了第一次試驗的結論。

指標變數ch_ptr_3內容與ch_ptr_1相同,ch_ptr_4與ch_ptr_1不同,這是為什麼呢?

該程式在編譯時沒有報錯,但是當執行line 17或line 18**之一時,就會出錯,系統不允許改變字串的內容。

單獨執行line 20沒有問題,說明字串在系統內部是以一小段空間儲存,並且根據該空間位址來操作的,同時printf函式接收的形參也就是字串首位址。

綜上所述:

1、單引號括起來的字元:實際上代表乙個整數,整數值就是這個字元的ascii值大小,如『a』跟97(十進位制)的含義是嚴格一致的,甚至可以互換。

2、雙引號括起來的字串:實際上代表乙個指向無名陣列起始字元的指標,這個無名陣列被雙引號之間的字串和乙個字元『\0』初始化,而且這個陣列內部資料是唯讀的,無法修改。

3、程式中使用字串常量會生成乙個「指向字元的常量指標」,當乙個字串常量出現在乙個表示式中時,表示式使用的值就是這些字元所儲存的位址,而不是這些字元本身。因此,可以把字串常量賦值給乙個「指向字元的指標」,該指標指向這些字元所儲存的位址。但是,不能把字串常量賦值給乙個字元陣列,因為字串常量的直接值是乙個指標,而不是這些字元本身。

注意:在c語言中,字串就是一串以nul位元組結尾的字串行。nul雖是字串的終結符,但它本身並不是字串的一部分。nul是ascii字符集中 『\0』 字元的名字,是1個位元組域的全0;null是乙個數值為0的指標,通常是占用4個位元組域的全0。雖然它們都是0,甚至某些場合可以互換使用(不考慮資料寬度),但實際工程中還是要使用適當的常量,因為它可以傳遞給讀者更多資訊。

備註:這篇文章為了驗證一些猜想,用到了一些「古怪」的方法,尤其是在對字元操作的時候,並不代表博主就同意在工程中可以使用這個方法,恰恰相反要嚴格避免,因為這些操作是編譯器未定義的。只為拋磚引玉,告訴你這裡有陷阱而已(其實更多的是告訴我自己,呵呵)!

c語言字元轉字串 C語言字串的另類用法

講這個例子前,咱們先來看乙個簡單的程式 字串陣列實現數字轉字母 include include int main void 當然我們也可以這麼寫,用指標的形式來表示 include include int main void 同樣的,結果也是和上面是一樣的,我們再對這種寫法進行簡化,如果初學者的基礎...

C語言 字串和字串函式

輸入 gets 函式 1.gets 從標準輸入裝置讀取字串,以回車結束讀取,使用 0 結尾,回車符 n 被捨棄沒有遺留在緩衝區。2.可以用來輸入帶空格的字串。3.可以無限讀取,不會判斷上限,因此使用gets不安全,可能會造成溢位。fgets 和 fputs 函式 1.fgets函式的第2個引數指明了...

C語言的字串轉整數 整數轉字串的函式

1字串轉 int atoi 標頭檔案 include atoi 函式用來將字串轉換成整數 int 其原型為 int atoi const char str 函式說明 atoi 函式會掃瞄引數 str 字串,跳過前面的空白字元 例如空格,tab縮排等,可以通過 isspace 函式來檢測 直到遇上數字...