字符串是以空字符(\0)結尾的char數組。
11.1.1 初始化
一、字符串常量
字符串常量又稱字符串文字,是指位於一對雙引號中的任何字符。雙引號裡的字符會加上編譯器自動提供的結束標志\0字符,作為一個字符串被存儲在內存裡。
如果字符串文字中間沒有間隔或者間隔的是空格符,ANSI C會將其串聯起來。
例如 char get[50]="How are" "you";和 char get[50]="How are you";等同
如果想在字符串中使用雙引號,可以在雙引號前加一個反斜線符號。
字符串常量屬於靜態存儲類,即在一個函數中多次調用這函數,該字符串在程序的整個運行過程中只存儲一份。
二、字符串數組及初始化
指定數組大小時,一定要確保數組元素數比字符串長度至少多1。未被使用的元素均被自動初始化為0。(是\0而不是數字0)
字符數組名也是數組首元素的地址。
三、數組和指針的差別
char heart[]=" I love Tillie!";
char *head="I love MIllie!";
主要差別在於數組名heart是個常量,而指針head是個變量。
1、兩者都可以使用數組符號。
2、兩者都可以使用指針加法。
3、只有指針可以使用增量運算符。
數組的元素是變量,但是數組名不是變量。
可以在聲明指針的時候加上const防止更改字符串內容。
const char *mytal1[5] char mytal2[5][81]
前者是一個指向char的指針的數組,而後者是一個char數組的數組。
前者存放5個地址,而後者存放5個完整的字符數組。
首先聲明數組大小:例如char name[81];
gets()讀取換行符之前的所有字符,在這些字符後添加一個空字符。
gets()使用一個地址將字符串賦予它,而且它返回一個指向char的指針值,如果出錯或者遇到文件結尾,它就返回一個空地址。(NULL)
fgets()函數改進了這個問題,它讓您指定最大讀入字符數。
1、它需要第二個參數來書名最大讀入字符數。如果這個參數值為n,則它就會讀取最多n-1個字符或者讀完一個換行符為止,由最先滿足的條件決定。
2、如果它讀取到換行符,會把她存儲到字符串中,而不是像gets()那樣丟棄它。
3、它還需要第三個參數來說明讀哪一個文件。從鍵盤讀取數據時,可以用stdin作為該參數。
也可以使用帶有%s格式的scanf()函數來讀入一個字符串。scanf()更基於獲取單詞而不是獲取字符串。
puts()函數使用很簡單,只需要給出字符串參數的地址。puts()現實字符串時自動在其後添加一個換行符。
fputs()函數是gets()的面向文件版本
1、fputs()需要第二個參數來說明要寫的文件,可以使用stdout作為參數來進行輸出顯示。
2、fputs()並不為輸出自動添加換行符。
也可以使用printf()函數來進行字符串的輸出。
#include<stdio.h>
void put1(const char *string)
{
while(*string!='\0')
putchar(*string++);
}
如果熟悉的話可以將while(*string!='\0')改為while(*string)
一、strlen()函數
用strlen()函數可以得到字符串的長度。
二、strcat()函數
strcat()函數接受兩個字符串參數,它將第二個字符串的一份拷貝添加到第一個字符串的結尾,從而使第一個字符串成為一個新的組合字符串,第二個字符串並沒有改變。
strcat()函數是char *類型,這個函數返回它的第一個參數的值。
三、strncat()函數
strcat()函數並不檢查第一個數組是否能夠容納第二個字符串。strncat()函數需要另一個參數來指明最多允許添加的字符的數目,例如strncat(bugs,addon,13);直到加到13個字符或遇到空字符位置。
四、strcmp()函數
strcmp()函數用來比較字符串內容,它比較的是第一個空字符之前的部分,因此可以用來比較存放在不同大小數組裡的字符串。
如果第一個字符串在字母表中的順序先於第二個字符串,strcmp()返回一個負數,如果相同,它返回0,如果順序後於則返回一個正數。
strcmp()是按機器編碼順序來進行比較的。
五、strncmp()函數
strncmp()比較字符串時,一直比較到找到不同的相應字符,也可以比較完由第三個參數指定的字符數。
六、strcpy()和strncpy()函數
strcpy()接受兩個字符串指針參數。將第二個字符串內容復制到第一個指針指定的地址。
strcpy()函數還有另外兩個有用的屬性。首先,它是char *類型,它返回的是第一個參數的值,即一個字符的地址。其次,第一個參數不需要指向數組的開始,這樣就可以只復制數組的一部分。
strncpy()需要第三個參數來指明最大可復制的字符數。
七、sprintf()函數
sprintf()函數的第一個參數是目標字符串的地址,其余的參數和printf()一樣。例如:sprintf(formal,"%s,%-19s:$%6.2f\n",last,first,prize);
將輸入格式化為標准形式後存放在字符串formal中。
把這個程序編譯為可執行文件repeat。 命令行 C>repeat Resistance is futile輸出如下
The command has 3 arguments
1: Resistance
2: is
3: futile
main()中的兩個參數,第一個參數是命令行中的字符串數,包括命令在內。第二個參數是一個指向字符串的指針數組。(argc:argument count;argv:argument value)
如果使用 repeat "I am hungry" now 則argc=3;
strol()、stroul()、strtod()其中strol()函數把一個字符串轉換為long型值。其原型如下
long strol(const char *nptr,char **endptr,int base);
如果基數是10,字符串“10”就被轉換為10;如果基數是16,則轉為16。第一次轉換在遇到空字符時結束,這樣end就指向空字符。
對於輸入的第二個字符串,end是‘a’字符的地址,因此,輸出end顯示的是字符串“atom”,輸出*end顯示的則是‘a’字符的ASCII碼。但是,如果基值變為16,'a'字符就會被識別為一個有效的十六進制數字,函數會把十六進制數10a轉換為十進制的266。