C語言中字符串的問題

C語言中的字符串的處理是軟件開發行業用的比較多的一個知識點,因此我們有必要了解一下字符串在C語言中長的是什麼樣子的。


字符串的概念:

  1. 字符串是有序字符的集合

  2. 字符串是程序中的基本元素之一

  3. C語言中沒有字符串的概念

    --C語言中通過特殊的字符數組模擬字符串

    --C語言中的字符串是以'\0'結尾的字符數組


字符數組與字符串

  1.在C語言中,雙引號引用的單個或多個字符是一種特殊的字面量

     --存儲於程序的全局只讀存儲區

     --本質爲字符數組,編譯器自動在結尾加上'\0'字符

字符串字面量在程序的運行期間是不能被改變的,一旦改變將引起程序的崩潰。


  例如:下面哪些是字符串?

    char ca[] = { 'H', 'e', 'l', 'l', 'o' };  //爲字符數組,不爲字符串,因爲結尾沒有'\0'
    char sa[] = { 'W', 'O', 'r', 'l', 'd', '\0' };  //爲字符串,結尾有'\0’
    char ss[] = "Hello World!";//爲字符串,字符串字面量,在C語言中是個特例,可以用字符串來初始化一個字符數組,編譯器會自動在結尾加上'\0’;
    char* str = "Hello World!";//爲字符串,用字符指針指向一個字符數組,合法

  1.PNG

程序運行後出現這樣的原因是因爲第11行中%s是要打印一個字符串,而ca是一個字符數組,所以程序運行會出現亂碼。

這裏我們要注意一點:就是所有與字符串相關的操作,所有與字符串相關的函數,都依賴於最後的‘\0’這個結束符,如果一個字符串沒有‘\0’,那麼它將退化爲字符數組,字符數組是不能作爲參數被字符串處理函數所處理的,否則出現錯誤。就如上面的那樣。


--字符串字面量的本質是一個數組

--字符串字面量可以看做常量指針

--字符串字面量中的字符不可改變(存儲於只讀存儲區)

--字符串字面量至少包含一個字符


"Hello World!”是一個無名的字符數組


下面的表達式輸出結果:

2.PNG

b裏面的“abc”是一個無名的字符數組,“abc"[0]實際上打印的是第0個元素  所以爲a;

c裏面的 “123”也是一個無名的字符數組,“123”+1實際上是指針運算,指針向後移動一位,所以爲2;

t裏面的  ""實際上是一個空字符串,裏面是“\0”,*“ ”表示將裏面的\0以十進制的方式打印出來,查詢ASC ‘\0’的十進制爲0;

3.PNG

%s是打印字符串,“Hello”爲字符串 所以被打印出來了。%p是打印地址,00FF5870是打印在內存中“world”的地址。



字符串的長度

 1.字符串的長度就是字符串所包含字符的個數

 2.字符串長度指的是第一個'\0'字符前出現的字符的個數。

 3.通過‘\0’結束符來確定字符串的長度


函數strlen用於返回字符串的實際長度

4.PNG


strlen()函數在處理字符串的時候遇到第一個\0就結束運算,打印出\0前面的字符的個數。當出現多個\0的時候,只以第一個作爲結束符。



小結:

  1. C語言中通過字符數組模擬字符串;

   2.C語言中的字符串使用'\0’作爲結束符;

   3.字符串字面量的本質爲字符數組

   4.字符串相關的函數都依賴於結束符'\0'


strlen()和sizeof()的區別

  1. strlen(...)是函數,要在運行時才能計算。參數必須是字符型指針(char*)。當數組名作爲參數傳入時,實際上數組就退化成指針。了。

  2. 它的功能是:返回字符串的長度。該字符串可能是自己定義的,也可能是內存中隨機的,該函數實際完成的功能是從代表該字符串的第一個地址開始遍歷,直到遇到結束符NULL。返回的長度大小不包括NULL

字符串的詳解:https://blog.csdn.net/smf0504/article/details/51673529


    3.sizeof(...)是運算符,在頭文件中typedef爲unsigned int,其值在編譯時即計算好了,參數可以是數組、指針、類型、對象、函數等。

       它的功能是:獲得保證能容納實現所建立的最大對象的字節大小。

       由於在編譯時計算,因此sizeof不能用來返回動態分配的內存空間的大小。

       具體而言,當參數分別如下時,sizeof返回的值表示的含義如下:
    數組——編譯時分配的數組空間大小;
    指針——存儲該指針所用的空間大小(存儲該指針的地址的長度,是長整型,應該爲4);
    類型——該類型所佔的空間大小;
    對象——對象的實際佔用空間大小;
    函數——函數的返回類型所佔的空間大小。函數的返回類型不能是void。

   sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。這是因爲sizeof是個操作符不是個函數。


我們能常在用到 sizeof 和 strlen 的時候,通常是計算字符串數組的長度
看了上面的詳細解釋,發現兩者的使用還是有區別的,從這個例子可以看得很清楚:

char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 計算字符串的長度,以結束符 0x00 爲字符串結束。
int b=sizeof(str); //而b=20; >>>> sizeof 計算的則是分配的數組 str[20] 所佔的內存空間的大小,不受裏面存儲的內容改變。



char* ss = "0123456789";
sizeof(ss) 結果 4 ===》ss是指向字符串常量的字符指針,sizeof 獲得的是一個指針的之所佔的空間,應該是長整型的,所以是4
sizeof(*ss) 結果 1 ===》*ss是第一個字符 其實就是獲得了字符串的第一位'0' 所佔的內存空間,是char類型的,佔了 1 位

strlen(ss)= 10 >>>> 如果要獲得這個字符串的長度,則一定要使用 strlen































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章