char类型数组
字符数组(⼀维、⼆维)(⼀)
第⼆节字符数组
字符数组是数组元素为char类型的⼀种数组。凡是适合数组的定义和赋值,也都适合于字符数组。由于C语⾔没有提供字符串类型,字符串⼀般⽤⼀维字符数组来存放,⽽⼆维字符数组可以存放多个字符串。
⼀、字符数组的定义
字符数组定义的⼀般格式为:
l            ⼀维字符数组:char 数组名[整型常量表达式];
l            ⼆维字符数组:char 数组名[整型常量表达式1][整型常量表达式2];
如: char c[10],c1[2][15];
⼆、字符数组的初始化和赋值
字符数组的初始化与赋值与⼀般数组的很相似,但也有其特殊之处。
1.⼀维字符数组的初始化
如下例:
char c[5]={ ' a', 'b', 'c', 'd', 'e'};
scanf输入整型数组这是最基本的初始化⽅式。在初始化时要注意数组元素存放的是字符,因此⽤单引号⽽不是⽤双引号,如下⾯的初始化:
char c[5]={ " a","b","c","d","e"}; /*错误初始化⽅式*/
这时每个元素的初值变成了字符串,这显然是错误的。
当字符数组⽤来存放字符串时,要注意字符串中包含了⼀个字符串结束标志'\0',这个结束标志也要占⽤⼀个单元。其初始化⽅式有以下⼏种:
l            ⽤{ }列出初值列表实现。如:
char s1[5]={ 'a', 'b', 'c', 'd', '\0'};
s1中存放的是字符串"abcd"
l            ⽤字符串常量直接初始化。如:
char s1[5]= "abcd";
这种⽅式初始化时,⼀定要注意数组的长度和字符串的长度的关系:字符串长度不包含结束符'\0',数组长度要把结束符算在其内,因此数组的长度要⼤于字符串的长度。如下⾯的操作是错误的:
char s1[5]= "abcde"; /*数组的空间不够存放字符串*/
l            省略数组的⼤⼩,进⾏初始化。这是根据初值中字符的个数确定数组的长度。如:
char s2[]="hello";
它等价于 char s2[6]= "hello";
2.⼆维字符数组的初始化
与其它⼆维数组初始化⼀样,有以下⼏种⽅式:
l            ⽤初值列表⽅式。如:
char s3[2][4]={{ ' a', 'b', 'c', '\0'},{' m', 'n', 'l', '\0'}};
l            ⽤字符串常量⽅式。如:
char s3[2][4]={ " abc"," mnl"};
l            省略第⼀维⼤⼩的⽅式来初始化。如:
char s3[][4]={{ ' a', 'b', 'c', '\0'},{' m', 'n', 'l', '\0'}};
或 char s3[][4]={ " abc","mnl"};
根据分⾏赋值的⼤括号{}的个数或常量字符串的个数确定第⼀维的⼤⼩为2。
3.赋值
与⼀般数组赋值相同,不能将⼀个字符串直接赋值给⼀个数组名,只能对字符数组的元素逐个赋值。如:
char s4[6];
要给它赋值为"hello",只能如下⽅式:
s4[0]= 'h',s4[1]= 'e',s4[2]= 'l',s4[3]= 'l',s4[4]= 'o',s4[5]= '\0';
⽽不能为:s4="hello";
也不能是:s4[6]= "hello";
注意:C语⾔中,⽆论是字符数组还是数值型数组在程序中只能给它的元素赋值。
三、字符数组的输⼊输出
其它类型的数组元素在输⼊输出时,只能逐个元素实现输⼊输出,但⽤字符数组来存放字符串时,可以进⾏整体的输⼊输出。
1.⼀维字符数组的输⼊输出
利⽤scanf()函数和printf()函数来实现输⼊输出时,通过在格式字符串中使⽤格式说明“%s”来实现。如:
例4.1        分析下⾯程序运⾏结果。
main( )
{
char s[7];
printf(" please input a string: ");
scanf(" %s",s);
printf("the string is: %s. ",s);
}
输⼊及运⾏结果为:
please input a string: hello↙
the string is: hello.
在输⼊时,已将字符串"hello"存放到了数组s中了。
注意:
在scanf()函数中使⽤格式说明“%s”时,该函数对应的输⼊数据项中直接⽤数组名,因为在C语⾔中数组名代表该数组在内存中的起始地址。
要求输⼊的字符串长度要⼩于数组的长度,因为系统会⾃动在输⼊的字符串后⾯加上字符串结束标志'\0'。
在输⼊字符串时,输⼊的字符串是以空格、Tab键或回车等空⽩字符作为字符串输⼊的结束标志,后⾯的字符将作为另外输⼊项的内容。如:
例4.2        分析下⾯程序运⾏结果。
main( )
{
char name[20];
printf("please input name: ");
scanf(" %s",name);
printf("the name: %s.\n",name);
}
程序输⼊及运⾏结果为:
please input name:zhang san↙
the name: zhang
该程序输⼊的虽然是" zhang san",但由于zhang后⾯有空格,故输出为" zhang",亦即数组name中的值为:" zhang"。
利⽤“%s”格式说明输出字符串时,printf()函数的对应输出项应直接给出数组名,⽽不能是数组元素,因为数组元素的类型为char类型,⽽使⽤的格式说明为“%s”,并且要求⽤printf()函数输出的字符数组,必须以' \0'作为结尾。
当然,字符串也可以通过scanf()函数和printf()函数利⽤格式说明“%c”来实现输⼊输出,但这时只能逐个字符的进⾏。还可以使⽤getchar()和putchar()函数来实现字符数组中单个字符的输⼊输出。
2.⼆维字符数组的输⼊输出
⼆维字符数组的每⼀⾏可以⽤来存放⼀个字符串,因此可以将⼆维字符数组看成是⼀个⼀维数组,数组中的元素为字符串,即被看作是字符串数组。如:
char ss[3][10];
数组ss可以被看作是⽤来存放3个字符串的字符串数组,每个字符串的长度不超过9。这时,对数组中字符串的引⽤,只使⽤第⼀个下标。即:
ss[0]:表⽰第⼀个字符串的⾸地址;
ss[1]:表⽰第⼆个字符串的⾸地址;
ss[2]:表⽰第三个字符串的⾸地址;
在输⼊输出时,通过使⽤“%s”格式说明将⾮常⽅便,例如:
例4.3        分析下⾯程序运⾏结果。
main( )
{
char ss[3][10];
int i;
printf("please input strings:\n");
for(i=0;i<3;i++)
scanf(" %s",ss[i]);
for(i=0;i<3;i++)
printf(" the No.%d string: %s\n",i+1,ss[i]);
}
数据输⼊及运⾏结果为:
please input strings:
Mary  John Smith↙
the No.1 string: Mary
the No.2 string: John
the No.3 string: Smith
注意:
l            在scanf()和printf()函数中输⼊输出字符串时,不能使⽤ss[i][j],因为ss[i][j]表⽰是字符元素⽽不是表⽰字符串。l            对字符串数组输出时,如上例ss[i]本⾝就代表第i⾏的字符串得⾸地址,故不能在前⾯再加“&”。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。