字串常量與字串陣列
其實這個問題已經遇到很多次了,每次都百度,當時都明白了,過一會就忘記了
現在暫時記錄整理一下,有時間作總結
首先,C語言沒有字串變數,只有字串常量,所以字串變數的任務就交給字元陣列解決了!
字串常量:"qwer"
嗯,這是一個字串常量,字串常量會在結尾加一個結束符'\0',所以這個字串常量的實際長度為5
字元陣列:char[5];
重點來了,這裡經常容易錯誤
1.首先,這個字串陣列的長度為5,這一定沒問題:從c[0]到c[4]。
2.然後,這其中字元陣列必須也有一個結束符號'\0',它在最後一個有意義的字元之後的一個位置(如果有意義的字元是2個的話,結束字元就在a[2]上,如果有意義的字元是3個的話,結束字元就在a[3]上)
3.理解了為什麼要有結束字元,接下來就是一些栗子了
1.char[5]={'q','w','e','r'}(正確寫法,末尾自動新增結束符)
2.char[5]={'q','w','e','r'.'t'};(錯誤寫法,編譯器不會報錯,輸出字串陣列名的時候結尾會有燙燙燙)
3.char[]={'q','w','e','r'};(錯誤寫法,編譯器不會報錯,輸出字串陣列名的時候結尾會有燙燙燙,因為並不知道字串的長度,無法推斷出結束符的位置,可以理解為編譯器不那麼智慧)
4.char[]={'q','w','e','r','\0'};(正確寫法,編譯器可以推斷出字串結束符號的位置)
5.char[5]="qwer";(正確寫法,末尾自動新增0)
6.char[5]={"qwer"}(正確寫法,末尾自動新增0)
7.char[5]="qwert"(正確寫法,末尾自動新增0)
8.char[5]={"qwert"}(錯誤寫法,編譯器會報錯)
9.char[]="qwer"(正確寫法,結尾自動添零,推斷出字串長度)
10.char[]={"qwer"}(正確寫法,結尾自動添零,推斷出字串長度)
11.char[5];
a[0]='q'
a[1]='w'
a[2]='e'
a[3]='r'
(錯誤寫法,編譯器不會報錯,輸出字串陣列名的時候結尾會有燙燙燙)
總結:經過以上分析可以看到
1雙引號的字串常量寫法是最好的
1.除非算上結束符號之後超過了陣列長度,否則都是對的
2.雙引號字串常量的寫法會自動新增結束符號,所以不要畫蛇添足,自己加結束符號,否則會超過長度)
2.單引號的寫法除了c[5]={‘q’,‘w’,‘e’}則這種既確定了長度,又留有足夠空間可以新增結束符號,並且還是採用的初始化列表初始化的,滿足這三個條件才才會自動新增0,除此之外不手動加0的全部是錯的!
3.strlen()函式求得是不帶'/0'結束符號的字母長度,如果沒有遇到結束符號,那麼求出的長度肯定大於得到的長度
4.關於字元陣列,字串常量和“指向字串的指標”
char p1[]="abcde";
char *p2=“abcde”
p1是字元陣列,"abcde"是字串常量
p2是"指向字串的指標"
char p1[5]; p1="abcde";//這種寫法是錯誤的!,因為陣列型別的資料必須初始化,並且不允許直接賦值
char *p2;p2="abcde";//這種寫法是對的(全域性變數,內建型別:包括基本和複合),因為是個指標變數 ,而不是陣列,p2可直接訪問文字常量區
char c='c';
另外 char*p3=&c也是可行的