字符串的定義及何時添加'\0'問題


定義字符串的六種形式:

①、 char *arr="hello world"; 

  原理:字符串常量的值本質上是第一個字符的地址。

②、 char *arr;arr="hello world"; 

  ①的改寫。

③、 char arr[]="hello";

  用字符數組儲存字符串,字符串在內存中的實際長度為6個char長度,包含了'\0'。

  1 printf("%d\n",strlen(arr));//5,strlen計算的長度不包含'\0',並在第一個'\0'處結束計算,比如對於字符串"abc\0def",strlen的計算結果是3
  2 printf("%d\n",sizeof(arr)/sizeof(arr[0]));//6,用sizeof計算的長度包含'\0'
  3 printf("%d\n",sizeof(arr)/sizeof(char));/,6,與上一個sizeof意義相同,是改寫

④、

  char arr[]={'H','e','l','l','o','\0'}; 

  如果沒有在末尾寫'\0',就是普通的字符數組,不構成字符串。

 ⑤、 char arr[6]="Hello"; 

  定義定長數組時給的長度要至少比字符串實際長度大一位,為'\0'留位置。這個列子中,<5數組溢出編譯失敗,=5沒有給'\0'留位置,就是普通的字符數組,不構成字符串。

  字符串要求結尾為'\0'充當結束標記,但字符數組不要求一定包含'\0'。不過要注意,當定義定長數組時,如果定的長度比字符串實際長度大,空的部分會自動填充'\0'。如 char arr[5]="ab"; ,實際是這樣的:'a','b','\0','\0','\0'

  1 char arr[10]="hello";
  2 printf("%d\n",strlen(arr));//5
  3 printf("%d\n",sizeof(arr)/sizeof(arr[0]));//10
  4 printf("%d\n",sizeof(arr)/sizeof(char));//10

⑥、

  char arr[6]={'H','e','l','l','o'};

  定義定長數組時給的長度要至少比字符串實際長度大一位,為'\0'留位置,會自動補充'\0'。詳見⑤。

 

常見的錯誤定義方法:

⑦、 char a[6]; a[6]="Hello"; 

  錯誤原因:a[6]是一個char型變量,"Hello"本質是第一個字符的地址,不能賦值。

⑧、 char a[6]; a="Hello";  char a[]; a="Hello";  

  錯誤原因:數組名a雖然是一個指針,但是已經指向內存中為a[6]分配的6個char長度空間,現在有讓其指向“Hello”的地址,指針會出現混亂。注意與②的區別。

 

注意:

用字符數組形式定義字符串與指針形式定義字符串存在差別:

①、使用字符數組形式,是從字符串常量詞中拷貝了一個副本,在修改字符數組中的內容時,只是修改副本,不會影響常量詞中的字符串;

②、使用指針形式,會影響到常量詞中的字符串。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM