C语言基础:字符数组
一维字符数组应用 存储字符串。1.定义类型 数组名[整形常量]; 整形常量 数组的容量表示可以储存多少个字符 类型 char c语言规定字符串必须使用\0 作为结束标准。 如果你要在数组中储存一个 hello , hello\0 共计6个字符空间 char string[100]; 2.访问数组名[整形表达式]str[0] a;char c str[0];使用下标 运算符 [] ,整形表达式 ,常量变量表达式-》 整形 。下标从 0 开始下标的范围 0 - 有效长度 (从下标0 开始 到字符串\0 之前的有效字符长度);字符数组 也是数组不能整体操作 。除非调用函数。char str[10]; str hello; // error 不能整体赋值。// 访问 写入 // 下标从0 开始, 长度 5 ,从下标0 开始 到字符串\0 之前的有效字符长度 str[0] h; // str[0] char str[1] e; str[2] l; str[3] l; str[4] o; str[5] \0; // \0 不可以省略 // 读出 数组元素 putchar(str[0]); // h printf(%c\n,str[1]);//e char c str[4]; // 字符数组 不可整体操作 //str world; puts(str); // 字符串整体输出 被输出的字符串一定是以\0 结尾 printf(str is %s\n,str);3.初始化// 全部初始化 char str1[6]{h,e,l,l,o,\0}; // a 字符常量 1字符 1byte char str2[6]{hello}; // hello 字符串常量默认是有\0 char str3[6]hello; // 用的多 // 局部初始化 ,剩下没有给处值的都是\0 char str4[10]{h,e,o,\0}; // \0 建议手动加上。 char str5[10]{hel}; char str6[10]hello; // 常用 char str7[10]{0}; // 常用空串 0; // 数字0 \0 ; //字符串结束标志 0 ‘\0’ 在内存中存储的 都是 0 0; //字符0 ascii 48 0x30 char str8[]{h,e,l};// 不是字符串字符数组没有\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]); } 字符串相关的常用函数函数名功能备注strlen获得字符串有效字符长度 size_t strlen(const char *s);strcpy字符串的复制从一个数组到另一个数组 char *strcpy(char *dest, const char *src);strcat字符串的拼接 char *strcat(char *dest, const char *src);strcmp字符串的比较比较字符串的内容是否一致 int strcmp(const char *s1, const char *s2);strlen char str[100]{0}; // char [] char * printf(input string); gets(str); //int len strlen(str); // 有效字符的个数 // int len 0; while(1) { if(\0!str[len]) { len; } else { break; } } 注意 strlen 和sizeof 的区别 1. strlen 函数 需要外部支持 c语言标准库 sizeof 关键字 不需要额外的支持 直接就能用 2. 相对字符数组 strlen 有效字符的个数 单位字节 sizeof 获得数组在内存中的大小 单位字节strcpy int main() { //char str1[100]hello; char str1[100]{0}; printf(input string:); gets(str1); char str2[100]{0}; // 不能整体操作 // str2 str1; // 把str1 的内容 复制到 str2 //strcpy(str2,str1); int i 0 ; while(1) { str2[i] str1[i]; if(\0 str1[i]) { break; } i; } puts(str2); return 0; } 注意 目标数组的大小要能容纳的下源数组的的内容。否则 数组越界。后续行为不确定(可能可以继续运行也可能程序崩溃但从逻辑上已经错误)。 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的结束的地方 { if(\0!str1[i]) { i; } else { break; } } while(1)// 开始拼接 { str1[i] str2[j]; if(\0 str2[j]) { break; } i; j; } printf(strcat str1:%s\n,str1); } strcmp 比较两个字符串的内容是否一致 int main() { char str1[100]hello; char str2[100]aaaaa; char str3[100]hello; // 不能写成这样这个不是比较 str1,str2 的字符串内容 /* if(str1 str2) { }*/ #if 0 // 系统函数的使用 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); } 二维字符数组应用存储多个字符串。二维数组 可以被称为 数组的数组。 数组的元素又是一个数组的结构。语法定义数据类型 数组名[行数][列数] 一维数 二维数 行数列数整型常量char str[3][100] ;访问, 通过下标运算符 [], 从0 开始表示第一个元素。 不要越界char str[3][100] ; 最后一个元素的下标位置 str[2][99] str[0] ,表示第一个字符数组 数组名 str[0][0], 表示第一个字符数组里的第一个字符元素存储 特性单一性连续性有序初始化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); } } }