怎样定义字符数组
用来存放字符数据的数组是字符数组。在字符数组中的一个元素存放一个字符。而字符型数据是以字符的ASCII代码储存在储存单元中的,一般占一个字节。例如:
char c[10];
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';
赋值以后数组为:
I am happy
字符数组的初始化
对字符数组初始化,最容易理解的方式是用"初始化列表",把各个字符依次赋给数组中各元素。例如:
char c[10]={'I','','a','m','','h','a','p','p','y'};
如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。例如:
char c[]={'I','','a','m','','h','a','p','p','y'};
也可以定义和初始化一个二维字符数组,例如:
char c[5][5]={{'','','*'},{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*'}};
用它代表一个菱形的平面图形,如:
*
* *
* *
* *
*
引用字符数组中的元素
引用字符数组中的一个元素,得到一个字符。
解题思路:先定义一个字符数组,并用“初始化列表”对其赋初值。然后用循环逐个输出此字符数组中的字符。
#include <stdio.h>
int main(){
char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
int i;
for(i=0;i<10;i++)
printf("%c",c[i]);
printf("\n");
return 0;
}
输出结果:I am happy
字符串和字符串结束标志
在C语言中,将字符串作为字符数组来处理的。在实际中,我们注意到的是字符串的有效长度而不是字符数组的长度。为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符“\0”作为结束标志。如果字符数组中有若干字符,前面九个字符都不是空字符,而第十个字符是“\0”,则认为数组中有一个字符串,其有效字符是九个。也就是说,在遇到字符“\0”时,表示字符串结束,把它前面的字符组成一个字符串。
注意:
C系统在用字符数组储存字符串常量时会自动加上一个’\0’作为结束符。例如“C progran”共有9个字符。字符串是存放在一维数组中的,在数组中它占10个字节,最后一个字节“\0”是系统自动加上的。
char c[]={'I',' ','a','m',' ','h','a','p','p','y','\0'};
不等于
char c[]={'I',' ','a','m',' ','h','a','p','p','y'};
前者的长度为11,后者的长度为10.
如果有:
char c[10]={"China"};
其前五个元素是'C','h','i','n','a',第六个元素是'\0',后四个自动设定为'\0'。
字符数组的输入和输出
字符数组的输入和输出可以有两种方法。
(1)逐个字符输入输出。用格式符“%s”输入或输出一个字符。
(2)将整个字符串一次输入或输出。用格式符“%s”,意思是对字符串的输入输出。例如:
char c[]={"China"};
printf("%s\n",c);
在内存中数组c的存储情况为:
China\0
输出时,遇到结束符'\0'就停止输出。输出结果为:
China
说明
(1)输出的字符中不包括结束符’\0’。
(2)用“%s”格式符输出字符串时,printf函数中的输出项时字符数组名,而不是数组元素名。下面这种就是错误的
printf("%s",c[0]);//c[0]不是字符数组名,而是一个数组元素
(3)如果数组长度大于字符串的实际长度,也是输出遇到"\0"结束。例如:
char c[10]={"China"};//字符串长度为5,连"\0"共占6个字符
printf("%s",c);
其前五个元素是'C','h','i','n','a',第六个元素是'\0',后四个自动设定为'\0'。
(4)如果一个字符数组中包含一个以上’\0’,则遇到第一个’\0’时就结束输出。
(5)可以用scanf函数输入一个字符串。scanf函数中的输入项如果是字符数组名,不要再加地址符&,因为在C语言中数组名代表该数组第一个元素的地址(或者说数组的起始地址)。例如:
scanf("%s",c);
错误写法:
scanf("%s",&c);
(6)scanf函数中的输入项c是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度。例如,已定义:
char c[6];
从键盘输入:
China
这是因为系统会自动在China后面加一个“\0”结束符。
(7)如果利用一个scanf函数输入多个字符串,则应在输入时以空格分隔。例如:
char str1[3],str2[3],str3[3];
使用字符串处理函数
常用函数
- puts函数——输出字符串的函数
其一般形式为:
puts(字符数组)
其作用是将一个字符串(以’\0’结束的字符序列)输出到终端。假如已定义str是一个字符数组名,且该数组已被初始化为’‘Hello’'。则执行:
puts(str);
用puts函数输出的字符串中可以包含转义字符,但是puts函数用的较少,平时用printf函数。例如:
char str[]={"Hello\nWord"};
输出:
Hello
Word
- gets函数——输入字符串的函数
其一般形式为:
gets(字符数组)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面的函数:
gets(str);//str是已定义的字符数组
从键盘输入:
Computer
将输入的字符串“Computer”送给字符数组str(送给数组的共有9个字符,而不是8个字
符)返回的函数值是字符数组str的第一个元素的地址。一般利用gets函数的目的是向
字符数组输入一个字符串,而不太关心其函数值。
注意:
puts和gets函数只能输出或输入一个字符串,不能写成
puts(str1,str2);
或者
gets(str1,str2);
- strcat函数——字符串连接函数
其一般形式为:
strcat(字符数组1,字符数组2)
其作用是把两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。例如:
char str1[30]={"hello"};
char str2[]={"Word"};
printf("%s",strcat(str1,str2));
输出:
helloWord
说明
(1)字符数组1必须足够大,以便容纳连接后的新字符串。
(2)连接前两个字符串的后面都有’\0’,连接时将字符串1后面的’\0’取消,只在新串最后保留’\0’。
4. strcpy和strncpy函数——字符串复制函数
其一般形式为:
strcpy(字符数组1,字符数组2)
其代表“字符串复制函数”,作用是将字符串2复制到字符数组1中去。例如:
char str1[10],str2[]="Hello";
strcpy(str1,str2);
说明
(1)字符数组1必须足够大,以便容纳被复制的字符串2。字符数组1的长度不应小于字符串2的长度。
(2)“字符数组1”必须写成数组名形式(如str1),"字符串2"可以是字符数组名,也可以是一个字符串常量。例如:
strcpy(str1,"China");
(3)如果在复制前未对str1数组初始化或赋值,则str1各字节中的内容是无法预知的,复制时将str2中的字符串和其后的’\0’一起复制到字符数组1中,取代字符数组1中的前面六个字符,最后4个字符不一定是’\0’,而是str1中原有的最后4个字节的内容。
(4)不能用赋值语句将一个字符串常量或者字符数组直接给一个字符数组。字符数组名是一个地址常量,它不能改变值,正如数值型数组名不能被赋值一样。如下面两行都是不合法的:
str1="China";//企图用赋值语句将一个字符串常量直接赋给一个字符数组
str1=str2;//企图用赋值语句将一个字符数组直接赋给另一个字符数组
- strcmp函数——字符串比较函数
其一般形式为:
strcmp(字符串1,字符串2)
它的作用是比较字符串1和字符串2。例如
strcmp(str1,str2);
strcmp("China","Word");
strcmp(str1,"Beijing");
说明
字符串的比较规则是:将两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到’\0’为止。
(1)如果全部字符相同,则认为两个字符串相等;
(2)若出现不相同的字符,则以第一对不相同的字符的比较结果为准。其中如果参加比较的两个字符串都是由英文字母组成的,则有一个简单的规律:**在英文字典中位置在后面的为“大”,但小写字母比大写字母“大”。**例如:
“A”<“B”,“A”<“a”,“computer”>“compare”,“1A”>“$20”
- 对两个字符串比较使用:
if(strcmp(str1,str2)>0)
printf("yes");
- strlen函数——测字符串长度的函数
其一般形式为:
strlen(字符数组)
它是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括’\0’在内)。例如:
char str[10]="China";
printf("%d",strlen(str));
输出结果:
5
- strlwr函数——转换为小写的函数
其一般形式为:
strlwr(字符串)
其作用是将字符串中的大写字母换成小写字母 - strupr函数——转换为大写的函数
其一般形式为:
strupr(字符串)
其作用是将字符串中小写字母换成大写字母
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
#include <stdio.h>
int main(){
char str[20];
int num=0,word=0,i;
char c;
printf("input a string:\n");
gets(str);//不能用scanf(),因为scanf函数读取字符串时以空格为分隔,遇到
//空格就认为当前字符串结束了,所以无法读取含有空格的字符串
for(i=0;(c=str[i])!='\0';i++)
if(c==' ')
word=0;
else if(word==0){
word=1;
num++;
}
printf("%d\n",num);
return 0;
}