指標和字串之間的聯絡
0.常見誤區
c語言中沒有string基本資料型別
C語言裡有
<string.h>
這個標頭檔案,所以就想當然的認為C語言裡有string這個型別,通過下面這種形式來宣告string的變數string aString;
編譯失敗。原來C語言裡壓根就沒有string這個型別,所以字串都是通過char陣列來儲存的, 而<string.h>
這個標頭檔案裡宣告的函式原型也全是針對char陣列的種種操作。直到C++中才出現了string這個類(注意是類, 不是型別)。字串通過字元陣列來定義時,預設會在陣列最後一個元素加上'\0'作為結束標誌
鑑於第二點,如果要區分普通的字元陣列和字串,參考如下程式碼
//此string1後面不會有'\0'標誌,就是一般的字元陣列
char string1[3]={'a','b','c'};
//string2為字串形式,結尾有\0標誌,長度為4
char string2[4]="abc"
注意:這裡的string2的長度可以不限定,預設省略,交給編譯器自動設定長度,如果需要人為設定長度,則需要考慮到'\0'字元
如果字元陣列長度不夠,則編譯器報錯
D:\otherworkspace\devcppworkspace\ds\ds-c2\demo5.cpp [Error] initializer-string for array of chars is too long [-fpermissive]
陣列名字和指標的關係
示例程式碼如下:
#include<stdio.h> int main(){ int i; char string[]="abc"; for(i = 0;i<4;i++){ printf("%p\t",string+i); printf("%p\t",&string[i]); printf("%c\n",string[i]); } return 0; }
列印結果
000000000062FE10 000000000062FE10 a 000000000062FE11 000000000062FE11 b 000000000062FE12 000000000062FE12 c 000000000062FE13 000000000062FE13
根據程式碼的執行結果來看,string【也就是陣列名字】其實就是一個指標,它指向了第1個元素【下標為0】,我們可以直接對指標進行算數運算,它會自動的根據指標型別移動相應的長度,比如說這裡的指標就是字元型,佔一個位元組,那麼string++,就會自動把指標往後移動一個位元組。
1.0 字串的讀取
#include <stdio.h>
int main()
{
char name[20];
printf("Enter name: ");
scanf("%s", name);
printf("Your name is %s.", name);
return 0;
}
執行結果:
Enter name: Dennis Ritchie
Your name is Dennis.
scanf()
函式讀取字元序列,當遇到空格(space,newline,tab etc.)時停止讀取。
那麼如何讀取行呢?
#include <stdio.h>
int main()
{
char name[30];
printf("Enter name: ");
fgets(name, sizeof(name), stdin); // read string
printf("Name: ");
puts(name); // display string
return 0;
}
輸出
Enter name: Tom Hanks
Name: Tom Hanks
在這裡,我們使用了fgets()函式從終端讀取字串。 fgets(name,sizeof(name),stdin); sizeof(name)的結果為30。因此,我們最多可以輸入30個字元作為輸入,即name字串的大小,也可以指定為其它的長度。 為了列印字串,我們使用了puts(name),你也可以直接使用printf()函式列印。
注意:gets()函式也可以接受使用者的輸入。但是,它已從C標準中刪除。 這是因為gets()允許輸入任意長度的字元。因此,可能存在緩衝區溢位。
1.1字串長度的獲取
示例程式碼
//求字串長度
#include <string.h>
#include <stdio.h>
int main(void)
{
const char str[] = "How many characters does this string contain?";
printf("without null character: %zu\n", strlen(str));
printf("with null character: %zu\n", sizeof(str) );
return 0;
}
output
without null character: 45
with null character: 46