前兩個單位咱們操做的都是一些數值型數據,整型或浮點型;可是在程序設計中字符中的處理是很是有用的。好比有一篇文章以文件的形式存在計算機中,如是要統計這篇文章有多少個單詞,或都查找有沒有出現某個關鍵詞,就須要學習字符串的處理技術,還要用到C語言庫中提供的字符串處理函數。編程
字符串的處理基於字符數組,字符數組就是字符串,因些,要從字符數組的定義講起。數組
字符數組的意義就是用數組方法來解決基於字符串的處理操做。函數
即然知道了字符數組是來解決基於字符串的處理操做的。那麼咱們先來分一下字符,字符串,字符數組又該怎麼解釋呢。學習
知道了什麼是字符,字符串,字符數組其實咱們應該也能總結出來了,字符數組是能夠包含多個字符,多個字符鏈接起來後就是字符串了,而字符串的程序語言中表示必須經過字符數組來使用。spa
數組在現實生活,及軟件開發過程當中使用很是靈活,一維數組能夠分爲整型一維數組、浮點型一維數組及字符型一維數組;二維數組及多維數組分法也和一維數組分法同樣,下面咱們主要講解字符數組中的一維字符數組。設計
(1) 一維數組的定義的形式始下:code
char 數組名[常量表達式];blog
例如開發
char name[100];字符串
char sex[10];
(2) 對於字符數組的定義說明以下請參考第十單元一維數組的定義說明部分:
(1) 單個字符賦值在定義數組時對數組元素賦以初值(同整型)。例如:
char a[5]={'a','b','c','d','e'};把值放在一個大括號中依次以逗號分隔,至關於a[0]='a',a[1]='b',a[2]='c',a[3]='d',a[4]='e';其中' '括起來只能是單個字符,字符常量的意思。
(2) 上述方法在字符數組中使用很是少主要用以下兩種方法:
① char 字符數組名[最大字符數+1]=「字符串」;
② char 字符數組名[]=」字符串」;默認長度是字符串字符個數+1。
③ char 字符數組名[最大字符數+1]=「字符串」; char 字符數組名[]={」字符串」}
注:雙引號「」的外面能夠加上{}變成{「」}也是對的,通常狀況下用「」是不加{}的。
總結:字符數組初始化方式共三種
字符數組初始化:(在定義字符數組同時,對數組元素賦以初值)有如下三種
①char a[20]={'n','m','1','\n','0'};
②char a[20]="nm1\n0";
③char a[20]={"nm1\n0"};
#include "stdio.h" void main() { char name[100]; printf("請輸入姓名:"); scanf("%s",name); printf("你的姓名是:%s\n",name);
注:只有在定義字符數組的時候能夠用賦值符號給字符數組總體賦值,定義完字符數組之後,再用賦值符號給字符數組總體賦值是錯誤的。
char a[5];
a[5]=」mnop」;這樣寫法是錯誤的
字符串經常使用函數能夠很方便的讓咱們操做字符數組,字符串函數有不少,可參考《C語言函數庫》查看各類函數的應用,今天咱們來學習下列四個經常使用的字符串函數:strcmp(),strlen(),strcpy(),strcat等。下面咱們就依次來說下這些函數的應用方法。
(1) 調用方式:gets(字符數組)
(2) 函數功能:從標準輸入設備(stdin)──鍵盤上,讀取1個字符串(能夠包含空格),並將其存儲到字符數組中去。
(3) 使用說明
① gets()讀取的字符串,其長度沒有限制,以敲回車鍵結束。編程者要保證字符數組有足夠大的空間,存放輸入的字符串。
② 該函數輸入的字符串中容許包含空格,而scanf()函數不容許。
(4) 應用代碼以下
/*利用gets()給數組賦值 */ #include "stdio.h" void main() { char name[100]; printf("請輸入字符串:"); gets(name); }
(1) 調用方式:puts(字符數組)
(2) 函數功能:把字符數組中所存放的字符串,輸出到標準輸出設備中去,並用‘\n’取代字符串的結束標誌‘\0’。因此用puts()函數輸出字符串時,不要求另加換行符.
(3) 使用說明
① 字符串中容許包含轉義字符,輸出時產生一個控制操做。
② 該函數一次只能輸出一個字符串,而printf()函數也能用來輸出字符串,且一次能輸出多個。
(4) 應用代碼以下
/*利用gets()給數組賦值 */ #include "stdio.h" void main() { char name[100]; printf("請輸入字符串:"); gets(name); printf("輸入字符串是:"); puts(name); }
(1) 調用方式:strcmp(字符串1 ,字符串2)
其中「字符串」能夠是串常量,也能夠是1維字符數組。
(2) 函數功能:比較兩個字符串的大小。
若是:字符串1等於字符串2,函數返回值等於0;
字符串1大於字符串2,函數返回值正整數1。
字符串1小於字符串2,函數返回值正整數-1。
(3) 使用說明
① 若是一個字符串是另外一個字符串從頭開始的子串,則母串爲大。
② 不能使用關係運算符「==」來比較兩個字符串,只能用strcmp() 函數來處理。
(4) ACM應用代碼以下
/*功能:簡單密碼檢測程序*/ #include "stdio.h" #include "string.h" void main() { char pass_str[80]; /*定義字符數組passstr*/ int i; /*檢驗密碼*/ for(i=1;i<=3;i++) { printf("請輸入密碼\n"); gets(pass_str); /*輸入密碼*/ if(strcmp(pass_str,"password")!=0) /*口令錯*/ printf("口令錯誤,還有%d次機會\n",3-i); else { printf("登陸成功\n");/*輸入正確密碼所進入的程序段*/ break; /*輸入正確的密碼,停止循環*/ } } }
(1) 調用方式:strcpy(字符數組, 字符串)
其中「字符串」能夠是串常量,也能夠是字符數組。
(2) 函數功能:將「字符串」完整地複製到「字符數組」中,字符數組中原有內容被覆蓋。
(3) 使用說明
① 字符數組必須定義得足夠大,以便容納複製過來的字符串。複製時,連同結束標誌'\0'一塊兒複製。
② 不能用賦值運算符「=」將一個字符串直接賦值給一個字符數組,只能用strcpy()函數來處理。
(4) ACM應用代碼以下
/*利用strcpy()操做數組 */ #include "stdio.h" void main() { char name1[100]=「zhangsan」; char name2[100]=」lisi」; strcpy (name1,name2); printf("新數組1是:%s",name1); }
(1) 調用方式:strcat(字符數組, 字符串)
其中「字符串」能夠是串常量,也能夠是字符數組。
(2) 函數功能:把「字符串」鏈接到「字符數組」中的字符串尾端,並存儲於「字符數組」中。「字符數組」中原來的結束標誌,被「字符串」的第一個字符覆蓋,而「字符串」在操做中未被修改。
(3) 使用說明
① 因爲沒有邊界檢查,編程者要注意保證「字符數組」定義得足夠大,以便容納鏈接後的目標字符串;不然,會因長度不夠而產生問題。
② 鏈接前兩個字符串都有結束標誌'\0',鏈接後「字符數組」中存儲的字符串的結束標誌'\0'被捨棄,只在目標串的最後保留一個'\0'。
(1) 調用方式:strlen(字符串);
其中「字符串」能夠是串常量,也能夠是字符數組。
(2) 函數功能:求字符串(常量或字符數組)的實際長度(不包含結束標誌)。
(3) ACM經典代碼:統計字符個數
/* 統計個數*/ #include "stdio.h" void main() { char str[100]; int i; int c1=0,c2=0;//c1統計小寫字母個數,c2統計大寫字母個數 printf("請輸入一個字符串:"); gets(str); for(i=0;i<strlen(str);i++) { if(str[i]>='a'&&str[i]<='z') //判斷是小寫字母 { c1++; } else if(str[i]>='A'&&str[i]<='Z') { c2++; } } //輸出統計結果 printf("小寫字母:%d個,大寫字母:%d個",c1,c2); }
/* Note:Your choice is C IDE */ #include "stdio.h" #include "string.h" void main() { //定義三個數組 char ay1[100],ay2[100]; char word[100];//暗語進行鏈接後的新數組 //輸入暗語 printf("請第一我的說暗語:"); gets(ay1); printf("請第二我的說暗語:"); gets(ay2); //組成一句暗語 strcat(strcpy(word,ay1),ay2); //與暗語進行比較 if(strcmp(word,"天王蓋地虎寶塔鎮河妖")==0) { printf("任務成功\n"); strcpy(ay1,"江南風光好"); strcpy(ay2,"遍地紅花開"); printf("第一人的新暗語:"); puts(ay1); printf("第二人的新暗語:"); puts(ay2); } else { printf("任務失敗\n"); } }