言基礎(chǔ):字符數(shù)組)
一維字符數(shù)組應(yīng)用 存儲(chǔ)字符串。1.定義類型 數(shù)組名[整形常量]; 整形常量 數(shù)組的容量表示可以儲(chǔ)存多少個(gè)字符 類型 char c語(yǔ)言規(guī)定字符串必須使用\0 作為結(jié)束標(biāo)準(zhǔn)。 如果你要在數(shù)組中儲(chǔ)存一個(gè) hello , hello\0 共計(jì)6個(gè)字符空間 char string[100]; ? ?2.訪問(wèn)數(shù)組名[整形表達(dá)式]str[0] a;char c str[0];使用下標(biāo) 運(yùn)算符 [] ,整形表達(dá)式 ,常量變量表達(dá)式-》 整形 。下標(biāo)從 0 開(kāi)始下標(biāo)的范圍 0 - 有效長(zhǎng)度 (從下標(biāo)0 開(kāi)始 到字符串\0 之前的有效字符長(zhǎng)度);字符數(shù)組 也是數(shù)組不能整體操作 。除非調(diào)用函數(shù)。char str[10]; str hello; // error 不能整體賦值。// 訪問(wèn) 寫入 // 下標(biāo)從0 開(kāi)始, 長(zhǎng)度 5 ,從下標(biāo)0 開(kāi)始 到字符串\0 之前的有效字符長(zhǎng)度 str[0] h; // str[0] char str[1] e; str[2] l; str[3] l; str[4] o; str[5] \0; // \0 不可以省略 ? // 讀出 數(shù)組元素 putchar(str[0]); // h printf(%c\n,str[1]);//e char c str[4]; // 字符數(shù)組 不可整體操作 //str world; puts(str); // 字符串整體輸出 被輸出的字符串一定是以\0 結(jié)尾 printf(str is %s\n,str);3.初始化// 全部初始化 char str1[6]{h,e,l,l,o,\0}; // a 字符常量 1字符 1byte char str2[6]{hello}; // hello 字符串常量默認(rèn)是有\(zhòng)0 char str3[6]hello; // 用的多 ? // 局部初始化 ,剩下沒(méi)有給處值的都是\0 char str4[10]{h,e,o,\0}; // \0 建議手動(dòng)加上。 char str5[10]{hel}; char str6[10]hello; // 常用 char str7[10]{0}; // 常用空串 ? 0; // 數(shù)字0 \0 ; //字符串結(jié)束標(biāo)志 0 ‘\0’ 在內(nèi)存中存儲(chǔ)的 都是 0 0; //字符0 ascii 48 0x30 ? char str8[]{h,e,l};// 不是字符串字符數(shù)組沒(méi)有\(zhòng)0 char str9[]{hello}; char str10[]hello; char str11[]{0}; // 不要寫成這種遍歷char str[10]{0}; printf(sizeof str[10] is %lu\n,sizeof(str)); printf(sizeof str[0] is %lu\n,sizeof(str[0])); int i 0 ; int len 0 ; // 遍歷的輸入 for(i0;i10 - 1 ;i) // \0 { scanf(%c,str[i]); if(# str[i]) { break; } len; ? } str[len]\0; //遍歷的輸出 for(i0;ilen;i ) // { putchar(str[i]); } ?字符串相關(guān)的常用函數(shù)函數(shù)名功能備注strlen獲得字符串有效字符長(zhǎng)度 size_t strlen(const char *s);strcpy字符串的復(fù)制從一個(gè)數(shù)組到另一個(gè)數(shù)組 char *strcpy(char *dest, const char *src);strcat字符串的拼接 char *strcat(char *dest, const char *src);strcmp字符串的比較比較字符串的內(nèi)容是否一致 int strcmp(const char *s1, const char *s2);strlen char str[100]{0}; // char [] char * printf(input string); gets(str); //int len strlen(str); // 有效字符的個(gè)數(shù) // int len 0; ? while(1) { if(\0!str[len]) { len; } else { break; } } ? 注意 strlen 和sizeof 的區(qū)別 1. strlen 函數(shù) 需要外部支持 c語(yǔ)言標(biāo)準(zhǔn)庫(kù) sizeof 關(guān)鍵字 不需要額外的支持 直接就能用 2. 相對(duì)字符數(shù)組 strlen 有效字符的個(gè)數(shù) 單位字節(jié) sizeof 獲得數(shù)組在內(nèi)存中的大小 單位字節(jié)strcpy int main() { //char str1[100]hello; char str1[100]{0}; printf(input string:); gets(str1); char str2[100]{0}; ? // 不能整體操作 // str2 str1; // 把str1 的內(nèi)容 復(fù)制到 str2 //strcpy(str2,str1); int i 0 ; while(1) { str2[i] str1[i]; if(\0 str1[i]) { break; } i; } puts(str2); return 0; } 注意 目標(biāo)數(shù)組的大小要能容納的下源數(shù)組的的內(nèi)容。否則 數(shù)組越界。后續(xù)行為不確定(可能可以繼續(xù)運(yùn)行也可能程序崩潰但從邏輯上已經(jīng)錯(cuò)誤)。 ?strcat ? int main() { ? char str1[100]hello;//dst char str2[100],world;//src //strcat(str1,str2); // int i 0 ; int j 0 ; while(1) // 找到 str1的結(jié)束的地方 { if(\0!str1[i]) { i; } else { break; } } ? while(1)// 開(kāi)始拼接 { str1[i] str2[j]; if(\0 str2[j]) { break; } i; j; } printf(strcat str1:%s\n,str1); ? } ?strcmp 比較兩個(gè)字符串的內(nèi)容是否一致 ? int main() { char str1[100]hello; char str2[100]aaaaa; char str3[100]hello; ? // 不能寫成這樣這個(gè)不是比較 str1,str2 的字符串內(nèi)容 /* if(str1 str2) { }*/ #if 0 // 系統(tǒng)函數(shù)的使用 int ret 0; ret strcmp(str1,str2); printf(str1 cmp str2 ret %d\n,ret); ? ret strcmp(str1,str3); printf(str1 cmp str3 ret %d\n,ret); #endif ? int i 0 ; int ret 0 ; while(1) { ret str1[i] - str3[i]; if(0ret str1[i]!\0) { i; } else { break; } } printf(ret is %d\n,ret); ? } ? ?二維字符數(shù)組應(yīng)用存儲(chǔ)多個(gè)字符串。二維數(shù)組 可以被稱為 數(shù)組的數(shù)組。 數(shù)組的元素又是一個(gè)數(shù)組的結(jié)構(gòu)。語(yǔ)法定義數(shù)據(jù)類型 數(shù)組名[行數(shù)][列數(shù)] 一維數(shù) 二維數(shù) 行數(shù)列數(shù)整型常量char str[3][100] ;訪問(wèn), 通過(guò)下標(biāo)運(yùn)算符 [], 從0 開(kāi)始表示第一個(gè)元素。 不要越界char str[3][100] ; 最后一個(gè)元素的下標(biāo)位置 str[2][99] ? str[0] ,表示第一個(gè)字符數(shù)組 數(shù)組名 str[0][0], 表示第一個(gè)字符數(shù)組里的第一個(gè)字符元素存儲(chǔ) 特性單一性連續(xù)性有序初始化char str1[3][50]{hello,ok,how}; char str2[3][50]{{hello},{ok},{how}}; char str3[3][50]{0} ; // 常用 char str4[3][50]{{0}}; char str5[][50]{hello,ok,123}; //一維大小可以省略二維不能省 //char str6[3][]{hello,ok,123}; ?字符串 逆序排序//逆序 for(i0;isize/2;i) { strcpy(t,str[i]); strcpy(str[i],str[size-1-i]); strcpy(str[size-1-i],t); } ? //排序 sort int j 0 ; for(jsize-1;j0;j--) { for(i0;ij;i) { if(strcmp(str[i],str[i1])0) { strcpy(t,str[i]); strcpy(str[i],str[i1]); strcpy(str[i1],t); } } } ?