8 字符數組與字符串
8.1 字符串變量的聲明與初始化
char city[9] = "New Yourk";char city[9] = {'N', 'e', 'w', 'Y', 'o', 'r', 'k', '\0'};
數組city的大小必須爲9個的原因,當編譯器把字符串符賦給字符數組時,會自動的在字符串的末尾添加空字符('\0')。字符串New York含有8個字符,另外還有一個空字符。注意,當以元素列舉的方式初始化字符數組時,必須顯示的加上空字符。
C語言在初始化字符數組時,也可以不用指定數組的大小。數組大小根據初始化元素自動確定。
char str[] = {'G', 'o', 'o', 'd', '\0'};
也可以把數組的大小聲明的比初始化的字符串更大。char string[10] = "Good";
這種情況下,計算機創建一個大小爲10的字符數組,並把值“Good”置於其中,以空字符結尾,其他元素則初始化爲空字符。
但是,後面語句是不合法的。char str1[3] = "Good";
同時還要注意,不能把初始化從聲明中分割開來。也就是,char str2[5];str2 = "Good"; 是不允許的。
同時,char s1[4] = "abc";char s2[4];s2 = s1;也是不允許的。數組名不能用作賦值運算符的做操作數。
用作終止的空字符:字符串不是C語言的數據類型,他是存儲在數組中的一種數據結構。字符串是長度可變的數據結構,存儲在長度固定的數組中。由於數組大小並不總是字符串的大小,大多數時候比保存在其中的字符串更大,因此,不能用數組的最後一個元素來表示字符串的結尾,而是需要某種方法來確定字符串數據的結尾。空字符就起到了“字符串結尾”標識符的作用。
8.4 在屏幕上顯示字符串
程序及其輸出演示了%s格式說明符的以下特性:
- 當字段寬度小於字符串長度時,顯示整個字符串;
- 小數點右邊的整數指定要顯示的字符數;
- 如果要顯示的字符指定爲零,那麼就什麼也不顯示;
- 說明符中的減號是的字符串以左對齊方式顯示;
- 說明符%.ns使得只顯示字符串的前n個字符。
printf支持使用變量字段寬度和精確度。如:printf("%*.*s\n", w, d, string );在寬度爲w的字段中顯示字符串的前d個字符。
8.5 將字符串組合在一起
正如我們不能直接將一個字符串賦給另一個字符串一樣,我們也不能用簡單的算術加來將連個字符串結合在一起。也就是說,下面語句不合法:str3 = str1 + str2;str2 = str1 + "hello";
8.6 字符串處理函數<string.h>
函數 |
形式 |
操作 |
strcat() |
strcat(str1, str2) |
連接兩個字符串,str2附加到str1
|
strcmp() |
strcmp(str1, str2) |
比較兩個字符串,相等則值爲0,否則返回不等字符的差值 |
strcpy() |
strcpy(str1, str2) |
str2的內容賦給str1 |
strlen() |
strlen(str1) |
返回字符串中字符數(不包括終止符) |
strncpy() |
strncpy(s1, s2, 5) |
把s2中前5個字符複製到s1 |
strncmp() |
strncmp(s1, s2, n) |
把s1和s2最左邊的n個字符進行比較 |
strncat() |
strncat(s1, s2, n) |
把s2最左邊的n個字符連接到s1的末尾 |
strstr() |
strstr(s1, s2) |
查找s1是否包含s2,返回s2首次出現的位置。否則,返回空指針 |
strchr() |
strchr(s1, 'm') |
定位'm'在字符串s1中首次出現的位置 |
strrchr() |
strrchr(s1, 'm') |
定位'm'在字符串s1中最後出現的位置 |
8.6.1 strcat()函數形式: strcat(str1, str2);
該函數,將str1後的'\0'刪除後,把str2放置於其後,即把str2附加到str1上。
下面語句也是合法的: strcat(str1, "good"); strcat(strcat(str1, str2), str3);要保證str1足夠大
8.6.2 strncpy(s1, s2, 5)由於前5個字符可能不包括終止符,因此必須顯示的在s1的第6個位置放置一個終止符,如下:
s1[6] = '\0';
注意:
- 當要創建一個數組來存儲位置大小的字符串變量時,可以用次表達式計算字符串的大小:strlen(strname) +1;
- 當把一個字符串複製或連接到另一個字符串中時,應確保目標字符串具有足夠的空間。記住,如果存儲空間不夠,不會給出任何消息。在複製時,可能導致內存覆蓋,發生未知錯誤。