字符数组的定义
1.字符数组:存放字符数据的数组,每一个元素存放一个字符。
2.字符数组定义的格式:
例:char c[10]; /* 定义c为字符数组*/
我们可以给每一个数组元素赋值,如:
c[0]='I'; c[1]=' '; c[2]='a'; c[3]='m'; c[4]=' ';
c[5]='h'; c[6]='a'; c[7]='p'; c[8]='p'; c[9]='y';
字符数组的初始化
1.逐个元素赋值初始化。
char ch[10]={‘C',‘h',‘i',‘n',‘a'};
2.初始化数据小于数组长度,多余元素自动为“空”(‘/0’,二进制0)。如图4.10所示
3.还可以用字符串常量给字符数组赋初值。
如 char ch[6]=“china”;
4.指定初值时,若未指定数组长度,则长度等于初值个数。
char c[ ]={'I',' ','a','m',' ','h','a','p','p','y'};
数组长度为10,包括两个空格。
5.不指定数组长度,逐个元素初始化和字符串常量初始化在内存中的存储情况是不一样的。如
char ch1[ ]={‘c’,‘h’,‘i’,‘n’,‘a’};在内存中占5个字节
char ch2[ ]=“china”;在内存中占6个字节
因为字符常量末尾自动带上一个‘/0’,所以字符串常量“china”占用内存空间6个字节,而逐个赋值的ch1占用5个字节。
字符数组的引用
引用一个元素,得到一个字符。因此可以用循环来实现对字符数组的输出。
例 输出一个字符串。
1 #include <stdio.h>
2 void main()
3 {
4 char c[10]={'I',' ','a','m',' ','a',' ','b','o','y'};
5 int i;
6 for(i=0;i<10;i++)
7 printf("%c",c[i]);
8 printf("/n");
9 }
输出结果:
I am a boy
例 输出一个钻石图形。
1 #include <stdio.h>
2 void main()
3 {
4 char diamond[ ][5]={{' ',' ','*'},
5 {' ','*',' ','*'},
6 {'*',' ',' ',' ','*'},
7 {' ','*',' ','*'},
8 {' ',' ','*'}};
9 int i,j;
10 for(i=0;i<5;i++)
11 {
12 for(j=0;j<5;j++)
13 printf("%c",diamond[i][j]);
14 printf("/n");
15 }
16 }
字符数组的输入输出
两种方法:
1、用“%c”格式符逐个输入输出。
2、用“%s”格式符按字符串输入输出。
第一种方法和前面所讲的数值数组的输入与输出方法相似,前面的例子多是这种方法。
第二种方法是使用“%s”格式字符对字符数组进行整体输入输出,这一点是数值性数组所不具备的,即数值性数组不能进行整体输入输出。
例 从键盘输入一字符串,并将其输出。
1 #include <stdio.h>
2 void main()
3 {
4 char ch[10];
5 printf("请输入一字符串:");
6 scanf("%s",ch); /*输入字符串*/
7 printf("/n");
8 printf("%s/n",ch); /*输出字符串*/
9 }
注意:
(1)输入时系统会自动在字符串末尾加上‘/0’;输出时,遇到第一个‘/0’结束,且输出字符中不包含'/0'。
(2)“%s”格式输出字符串时,scanf()函数的输入项为字符数组名,且不要加‘&’字符;printf()函数的输出项是字符数组名,而不是元素名。
(3)“%s”格式输出时,即使数组长度大于字符串长度,遇‘/0’也结束。例:
char c[10] = {"China"};
printf(“%s”,c); /*只输出5个字符,而不是10个字符 */
(4)scanf()函数输入一个字符串时,以空格作为字符串的结束标志。例:
scanf(“%s”,ch);
printf(“%s”,ch);
如果输入的是:How are you,输出结果为:How。后面的are you不能送入到ch中。
(5)C语言中,数组名代表该数组的起始地址,因此,scanf()函数中不需要地址运算符&。例:
char str[13];
scanf("%s",str);
scanf(“%s”,&str);/*错误*/
(6)不能采用赋值语句将一个字符串直接赋给一个数组。例:
char c[10]; c=“good”;/*错误*/
但是可以初始化:如:char c[ ]= “good”;
字符串处理函数
在C的函数库中,提供了一些字符串处理函数。下面予以介绍:
字符串输入、输出函数:
在调用字符串处理函数时,在程序前面必须设置一个相关的文件包含预处理命令,即:#include <stdio.h>
1.字符串输出函数(puts()) 格式:
输出字符串(以‘/0’结尾的字符序列)。
例:char c[6]=“China”;
puts(c); /*不需要格式控制符,且自动换行*/
上述函数调用与下面的函数调用等价。
printf("%s/n",c); /*需要格式控制符%s*/
2.字符串输入函数(gets())
输入字符串到相应的字符数组中。
例:char str[12];
gets(str);
如果输入How are you,gets函数可以将其全部送入以str为首址的内存中,即gets函数以回车作为结束输入的标志,而不是空格。
注意:gets()、puts()一次只能输入输出一个字符串。而scanf()、printf()可以输入输出几个字符串。
3.字符串连接函数(strcat())
功能:把“字符数组2”连接到“字符数组1”的后面。从字符数组1原来的’/0’(字符串结束标志)处开始连接,结果存放在字符数组1中。
例:char ch1[20]=“computer is”;
char ch2[10]=“ good!”;
printf(“%s”,strcat(ch1,ch2));
输出结果为:computer is good!
注意:
字符数组1要有足够的空间,以确保连接字符串后不越界,字符数组2可以是字符数组名,字符串常量或指向字符串的字符指针(地址)。
4.字符串拷贝函数(strcpy())
功能:将“字符数组2”为首地址的字符串复制到“字符数组1”为首地址的字符数组中。即把“字符数组2”的值拷贝到“字符数组1”中。
例:char str1[10],str2[ ]={“china”};
strcpy(str1,str2);
注意:str1一般为字符数组,要有足够的空间,以确保复制字符串后不越界;str2可以是字符数组名,字符串常量或指向字符串的字符指针(地址)。
字符串(字符数组)之间不能用赋值符赋值,即不能使用赋值运算符复制字符串。str1=str2;是错误的。通过此函数,可以间接达到赋值的效果
5.字符串比较函数(strcmp())
功能:比较“字符数组1”和“字符数组2”,例:
strcmp(str1,str2);
strcmp("China", "Korea");
strcmp(str1, "Beijing");
比较规则:逐个字符比较ASCII码,直到遇到不同字符或‘/0’,比较结果是该函数的返回值。
(1)字符数组1 == 字符数组2, strcmp()返回值为0;
(2)字符数组2 > 字符数组2, strcmp()返回值为一正整数;
(3)字符数组1 < 字符数组2, strcmp()返回值为一负整数。
注意:字符串只能用strcmp函数比较,不能用关系运算符“==”比较。
例:if (strcmp(str1,str2) == 0) printf("yes");
而if (str1 == str2) printf(“yes”)是错误的。
6.求字符串的长度函数(strlen())
功能:统计字符数组中字符串的长度(不包括“字符串结束标志”),并将其作为函数值返回。
例:char str[10]={“Beijing”};
printf(“%d”,strlen(str));
输出结果为7而不是8。
7.大写字母转变为小写字母函数(strlwr())
功能:将字符数组中大写字母全部转变成小写字母。
例如:char str[10]={“HELLO”};
printf(“%s”,strlwr(str));
输出结果为:hello
7.小写字母转变为大写字母函数(strupr())
功能:将字符数组中小写字母全部转变成大写字母。
例如: char str[10]={“hello”);
printf(“%s”,strupr(str));
输出结果为:HELLO