字符數組
在C語言中,支持字符串常量,不支持字符串變量。如果想要實現類似的字符串變量,C語言提供了兩種實現方式:
字符數組:
?char name[] = “哪吒”;
字符指針:
?char *name = "娜吒";
概念
元素類型為char(字符型)的數組叫做字符數組。字符數組往往是用來存儲字符串數據的。需要注意的,我們C語言中的字符是字節字符(1字符 = 1字節,C語言中沒有字節這個表示法,我們一般使用char表示字節,1char = 8bit)。
硬件中存放數據以bit(位)為單位,系統對于內存的操作以char(字節)為單位。系統為內存以1個字節為單位進行編號。
實驗:
?char a = 'A'; ? ? ?// 正確char b = '1'; ? ? ?// 正確 ASCII碼:49char c = 1; ? ? ? ?// 正確 ASCII碼:1char d = '\n'; ? ? // 正確 只要其對應的 ASCII碼的范圍在0~127之間,都屬于字符char e = "A"; ? ? ?// 錯誤 雙引號括起來的內容叫做字符串常量char f = '馮'; ? ? // 錯誤 中文字符不在0~127這個范圍內
語法
一維數組:
?char 數組名[數組容量];
二維數組:
?char 數組名[行容量][列容量];
字符數組的語法就是我們之前所學的一維數組和二維數組的語法,只不過數據類型是char而已。
注意:
如果我們的char數組初始化的時候,沒有完全初始化值的時候,使用\0
(\0
對應的ASCII值是0
)進行填充。大家要注意,這里的\0
只是起到一個占位或者標識的作用,我們是無法通過printf等打印輸出到控制臺的(不支持輸出)。
比如:
?char c[8] = {'h','e','l','l','o'}; //一維的字符數組的初始化,未初始化部分補'\0'或者0char c[8] = {'h','e','l','l','o','\0','\0','\0'};
案例1
案例1
需求:輸出一個字符序列(I LOVE YOU)
代碼:
/*************************************************************************> File Name: ? demo03.c> Author: ? ? ? 阮> Description: ?> Created Time: 2025年07月19日 星期五 14時29分35秒************************************************************************/?#include <stdio.h>?int main(int argc,char *argv[]){// 創建一個數組,用來存儲I LOVE YOU ? 空格' '也是字符,對應的ASCII 為 32char arr[] = {'I',' ','L','O','V','E',32,'Y','O','U'}; ??// 計算數組的大小int len = sizeof(arr) / sizeof(arr[0]);?// 遍歷數組for (int i = 0; i < len; i ++) printf("%c",arr[i]);?printf("\n");?return 0; }?
結果:
案例2
需求:輸出一個用字符
*
組成的空菱形圖案。代碼:
/*************************************************************************> File Name: ? demo04.c> Author: ? ? ? 阮> Description: ?> Created Time: 2025年07月19日 星期五 14時40分11秒************************************************************************/?#include <stdio.h>?int main(int argc,char *argv[]){// 創建一個二維數組,存放菱形char arr[5][5] = {{' ',' ','*',' ',' '},{' ','*',' ','*',' '},{'*',' ',' ',' ','*'},{' ','*',' ','*',' '},{' ',' ','*',' ',' '}};?// 計算行和列的大小int row_len = sizeof(arr) / sizeof(arr[0]);int col_len = sizeof(arr[0]) / sizeof(arr[0][0]);?// 遍歷數組for (int i = 0; i < row_len; i++){for (int j = 0; j < col_len; j++) printf("%c",arr[i][j]); printf("\n");}?printf("\n");?return 0;}
結果:
注意
如果定義時,不初始化,元素值不確定(局部作用域)
char arr1[2]; ? // 此時,這個數組中元素的值是隨機值char arr2[3] = {'a','b','c'}; // 此時屬于部分初始化,未初始化的元素使用 \0 填充char arr3[3] = {}; ?// 此時所有的元素使用 \0 填充char arr4[3] = {0}; // 此時所有的元素使用 \0 填充
如果提供的字符個數大于數組長度,則按照語法錯誤處理(會報警告,但是能編譯通過);如果字符個數小于數組長度,后面的元素自動補
\0
?char arr1[2] = {'h','e','e'}; ? // 編譯通過,但是會報警告(warning),不建議寫,實際存放的是 hechar arr2[3] = {'a'}; ? ? ? ? ? // 正確寫法,部分初始化,未初始化部分補 \0
如果提供的字符個數與數組長度相同,可以省略數組長度,系統會自動確定元素的個數,適合字符較多時。
?char arr1[] = {'b','u'}; // 正確,根據初始化元素,由系統自動計算元素個數
字符串結束標志
說明
C語言規定,字符串常量以字符
\0
作為結束標志。編譯系統對字符串常量自動加一個
\0
作為結束標志。char *name = "tom"
,實際存儲為{'t','o','m','\0'}
程序中往往通過判斷
\0
來檢測字符串是否結束。舉例:while(arr[i] != '\0'){..}
\0
的ASCII碼是0,不是一個可顯示可輸出的字符,是“空操作符”。它什么都不做,不會增加有效字符,僅僅用作一個工程判別的標志或者在數組中占位。char a[] = {'h','i'}; ? ? ? ?// 輸出:hichar a[] = {'h','i','\0'}; ? // 輸出:hichar c[] = "hello"; ? ? ? ? ?// 輸出:hello,實際存儲:hello\0 將字符串常量賦值給字符數組 ?
字符數組的多樣表示
我們的char數組可以以數組的形式一個一個輸出每個字符;也可以以字符串的形式整體輸出。
演示:
/*************************************************************************> File Name: ? demo05.c> Author: ? ? ? 阮> Description: ?> Created Time: 2025年07月19日 星期五 15時31分37秒************************************************************************/?#include <stdio.h>?int main(int argc,char *argv[]){// 字符串的第1種表示:char s1[] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};// 字符個數:12// 字符串的第2種表示:char s2[] = {"hello world"};// ""包裹的內容是字符串常量,字符串常量默認末尾有一個\0 字符個數:12// 字符串的第3種表示:char s3[] = "hello world"; // 字符個數:12?// 字符串的第1種輸出:// 計算字符串所占字節數printf("s1=%lu,s2=%lu,s3=%lu\n", sizeof(s1), sizeof(s2), sizeof(s3)); // s1=12,s2=12,s3=12?// 計算數組大小int len = sizeof(s3) / sizeof(s3[0]);?// 遍歷for (int i = 0; i < len; i++){// 過濾\0if (s1[i] == 0 || s2[i] == '\0' || s3[i] == 0) continue;?printf("%c,%c,%c\n", s1[i], s2[i], s3[i]);}printf("\n");??// 字符串的第2種輸出:printf("%s,%s,%s\n",s1,s2,s3);printf("\n");?return 0;}
結果:
注意
字符串的長度與字符數組的長度不一定相同。
char name[] = "hello"; ?// 數組長度:6,字符串長度:5
利用字符串常量可以對字符數組進行初始化,但不能用字符串常量對字符數組賦值。
// 正確演示:利用字符串常量給字符數組初始化
char arr1[] = "hello";
// 錯誤演示:利用字符串常量給字符數組賦值
char arr2[6];arr2 = "hello"; ?// 可以理解為,數組是一個常量
章節作業
一維數組練習題
鍵盤錄入一組數列,利用冒泡排序將數據由大到小排序
從鍵盤輸入年、月、日,計算并輸出該日是該年第幾天
鍵盤錄入一組數列,求最大數、最小數、均值
從鍵盤錄入一組數列,判斷是否是回文,舉例:12321,abba,121
用數組存儲10個整型數,通過鍵盤輸入一個數,找出該數在數組中的下標值
通過鍵盤輸入 10 個學員成績: 1)輸出不及格學員的成績和下標。 2)求最高分的下標值 3)求最低成績的下標值 4)求總成績及平均成績
二維數組練習題
一個二維數組賦了初值,用戶輸入一個數,在該二維數組中查找。找到則返回行列位置,沒找到則提示。
二維整型數組,求所有元素平均值,求每行最大值,求每列最小值。
在行列相等數組計算主對角線元素的和
計算一個矩陣下三角元素的和
電影院為了答謝影迷的支持,在某一排的某一列座位上放置了一個大禮包,放置禮物的位置具有這樣的規則(行和列的平方和為開店日期 512(5月12日)); 請設計程序找出大禮包的位置,(假定電影院有20排,每排25個座位)
字符數組練習題
編寫一個程序,讀取用戶輸入的字符串,并將其反轉輸出。
編寫一個程序,判斷用戶輸入的字符串是否為回文(即正反讀都一樣的字符串)。
思考題【選做】
求出一個矩陣的鞍點。鞍點的含義為行上最大同時列上也最大。