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