1. 字串入門
字串也稱字串字面量,是用一對雙引號括起來的字元序列。
我們也許經常會遇到字串特別長的情況,在C#中,我們一般會用@符號來表示。
Console.WriteLine(@"Hello
World");
但是在C中,我們會這樣來寫:
int main()
{
printf("Hello "
"world");
return 0;
}
還記得我曾經講的最多的一句話就是,把字串當做字元數組來玩。
其實在本質上,C語言就是把字串作為字元數組來處理,當C語言編譯器遇到長度為N的字串時,它會為字串字面量分配長度為N+1的記憶體空間。之所以為N+1,是因為在字串的末尾以’\0’來結尾,來標識字串的結束。
既然,我們說字串在編譯器中以字元數組來處理,那麼編譯器自然會將其看成char *類型的指標。也就是說,我們可以這樣來寫:
int main()
{
char *str="abc";
printf("%s",str);
}
2. 字元數組和字元指標
這樣的兩個聲明:
char str1[]="abc";
char *str2="def";
前者是普通的字元數組,後者是字元指標。兩者都可以用作字串,但是他們是不一樣的。
聲明為數組時,就像其他常規的數組一樣,可以隨意修改數組中的元素,即字串中的字元。但是用字元指標,我們是不能修改的。
另外,聲明為數組時,我們知道我們不能將這個數組名賦給其他的數組,但是如果用指標,我們則可以將該指標指向其他的字串。
用最簡單的例子來說明:
char str1[]="abc";
char *str2="def";
*str2='q'; //Error
str1[0]='q';
前者是錯誤的,後者是正確的。
3. 聲明字元數組的慣用法
看段代碼就OK了
#define STR_LEN 10
int main()
{
char str[STR_LEN+1];
}
在宏定義處強調的是字串的大小,而在聲明字元數組的時候,將宏定義加1,因為要儲存”\0”。
4. 字串的輸入輸出
字串的輸出方式有兩種,printf和puts,下面的例子足以說明他們的區別:
int main()
{
puts("Hello world");
printf("Hello world");
return 0;
}
運行結果如下:
答案就是一個有換行,一個沒有換行。
讀取字串也有兩個方法:scanf和gets函數。
我們來說下他們的區別:
scanf會忽略掉之前所有的空白字元,然後讀取所有字元,直到遇到空白字元位置。總之,scanf不會包含任何空白字元,包括空格,定位字元等等。
gets不會忽略空白字元,讀取所有字元,直到遇到分行符號為止。
舉個例子吧:
int main()
{
char str1[100];
scanf("%s",str1);
printf("printf的?結á果?:%s",str1);
}
int main()
{
char str2[100];
gets(str2);
printf("gets的?結á果?:%s",str2);
return 0;
}