天天看點

C語言學習筆記(8)

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;
}      

運作結果如下:

C語言學習筆記(8)

答案就是一個有換行,一個沒有換行。

讀取字元串也有兩個方法: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;
}      
下一篇: Servlet