字符数组的定义
同整型数组一样:
一维数组定义:char c[10];
二维数组定义:char ch[3][4];
字符数组初始化
- 定义数组时初始化,如:
char c[10]={'a','b','c','d'};
- 按每个字符元素输出时,
- 输出格式为时
printf("%d\t",c[i]);
则会输出字符分别对应的ASCII码,后面用0补全; - 输出格式为时
printf("%c\t",c[i]);
则会输出a b c d四个字符,后面元素自动定为空字符(’\0’),输出结果如图:
- 输出格式为时
- 作为整个字符输出时:
printf("%s",ch);
则输出abc。 - 由于字符型数据是以整型数据形式(ASCII码)存放,所以也可以用整型数组来存放字符数据;
int a[10]; a[0]='a';
缺点:容易造成内存空间的浪费,因为一个整型数据占4个字节,一个字符型数据占1个字节。
- 按每个字符元素输出时,
- 仅定义数组char c[10];后没有对数组初始化,会输出不可预估的值;如果花括号中提供的字符个数>数组长度,则会出现语法错误;
- 可以不写数组长度:
char c[]={'a','b','c','d'};
数组长度即为大括号中的字符个数。可用printf("数组长度为:%d\n",sizeof(c));
验证。 - 用字符串常量初始化字符数组
char c[]="i am A";
末尾自动加’\0’,等同于char c[]={'i',' ','a','m',' ','A','\0'}
,也可以把大括号去掉char c[]={"i am A"};
此时数组长度为7,最后一位是’\0’。 - C语言中数组名代表该数组的起始地址,所以不能在初始化后重新赋值。
如:char str1[]=“china”; str1=str2;编译错误
字符串存放
C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符型数组中的。C语言将字符串作为字符数组来处理
- 字符串结束标志—’\0’
- C系统在字符数组中存放字符串常量时,会自动加一个’\0’作为结束符。如果将"i am A"字符串常量存入一维数组的话,占7个字节,最后一位是’\0’。
- ‘‘\0’代表ASCII码为0的字符,是一个空操作符,只起一个标志作用。
'\0’的作用
表示字符串结束
如:定义数组 char str1[]=“china”; 如果想用scanf(…)或者gets()对数组中的元素进行修改的话,如:
char str1[]="china";
scanf("%s",str1);
//或gets(str1);
puts(str1);
/*
for(int i=0;i<5;i++){
printf("%c\t",str1[i]);
}
*/
最多可输入长度为6的字符串(包含’\0’),否则会报错;
假设输入的字符串是"ww",用scanf或者gets函数时,会自动给输入的字符串末尾加一个’\0’;所以此时数组str1中存放的元素为: w w \0 n a \0
- 用puts()输出和for循环遍历输出的结果是不一样的:
- puts将第一个\0前的字符串输出,输出结果为 : w w;
- for循环是将元素一一输出,输出结果为: w w \0(不输出) n a \0(不输出) ;
- 如果将for循环中的循环条件i<5改为i<strlen(str1)后,跟puts的输出结果是一样的。说明strlen()计算字符数组长度也是计算到第一个’\0’结束。