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;
}
運作結果如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iYtVHa09VZnFWbp9CXDhjQ0EzX4M0LcJXZ0lmcXVmdpx0c39GZul2VvwVb5t2Lc12bj91cn9Gbi52YvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
答案就是一個有換行,一個沒有換行。
讀取字元串也有兩個方法: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; }