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(i=0;i<10 - 1 ;i++) // \0 { scanf("%c",&str[i]); if('#' == str[i]) { break; } len++; } str[len]='\0'; //遍历的输出 for(i=0;i<len;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(0==ret && 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(i=0;i<size/2;i++) { strcpy(t,str[i]); strcpy(str[i],str[size-1-i]); strcpy(str[size-1-i],t); } //排序 sort int j = 0 ; for(j=size-1;j>0;j--) { for(i=0;i<j;i++) { if(strcmp(str[i],str[i+1])>0) { strcpy(t,str[i]); strcpy(str[i],str[i+1]); strcpy(str[i+1],t); } } } 