c语言声明数组的方法(C语言学习简单的介绍字符数组)
c语言声明数组的方法(C语言学习简单的介绍字符数组)字符数组赋值std后,其存储结构如图:char std1[6]={'c' 'h' 'i' 'n' 'a' '\0'};例如,我们可以将一个字符串放到一个一维字符数组中,将多个字符串放到一个二维字符数组中。当定义一个字符数组来存储字符数组时,这个字符数组必须足够大,以便能存储下字符字符串中的字符以及字符串结束符。用二维字符数组存储多个字符串时,应保证二维字符数组的列数足够大,以便能容纳得下最长的那个字符串。打印一个不包含字符串结束符的字符串,将导致字符串后边的字符也被持续地打印出来,直到遇到一个空字符为止。每个字符串在内存中都占用一段连续的存储空间,而且这段连续的存储空间有唯一确定的首地址。如果它只是一个字符串常量,那么这个字符串常量本身代表的就是该字符串在内存中所占连续存储单元的首地址;如果用一个一维字符数组存储字符串,那么这个一维字符数组的名字就代表这个首地址。用字符型数据对数组进行初始
字符串数组与字符串的关系
字符串是由若干有效字符构成且以字符'\0'作为结束标志的一个字符序列。
字符串常量是用一对双引号括起来的一串字符,如“happy”。其中'\0'作为字符串的结束标志,在这里可不显式输出,C编译程序自动在其尾部自动添加字符'\0'。
C语言中只提供了字符数据类型,没有提供字符串数据类型,C语言中的字符串是通过字符数据来实现的,所有表示字符串的字符数组的最后一个元素都是空字符(ASCII 码值为0的字符'\0')。对一个字符串的访问则是通过指向字符串中第一个字符的指针来实现的。一个字符串的值就是它的第一个字符的地址。因此,在C语言中字符串其实就是指向字符串首个字符的指针。在这个意义上,字符串很像数组,因为数组名也是指向其首个元素的指针。
例如,我们可以将一个字符串放到一个一维字符数组中,将多个字符串放到一个二维字符数组中。当定义一个字符数组来存储字符数组时,这个字符数组必须足够大,以便能存储下字符字符串中的字符以及字符串结束符。用二维字符数组存储多个字符串时,应保证二维字符数组的列数足够大,以便能容纳得下最长的那个字符串。打印一个不包含字符串结束符的字符串,将导致字符串后边的字符也被持续地打印出来,直到遇到一个空字符为止。每个字符串在内存中都占用一段连续的存储空间,而且这段连续的存储空间有唯一确定的首地址。如果它只是一个字符串常量,那么这个字符串常量本身代表的就是该字符串在内存中所占连续存储单元的首地址;如果用一个一维字符数组存储字符串,那么这个一维字符数组的名字就代表这个首地址。
用字符型数据对数组进行初始化
因为字符数组是由字符组成的数组,所以字符型数组对数组进行初始化。即把所赋值初值依次放在一对花括号内。例如:
char std1[6]={'c' 'h' 'i' 'n' 'a' '\0'};
字符数组赋值std后,其存储结构如图:
字符数组std有6个元素,但其存储的字符串长度为5,这是因为字符结束标志'\0'也占用一字节的存储,但它不计字符串的实际长度。因此,在定义字符数组长度时,除了要考虑字符串中的实际字符个数外,还必须多留出一字节的存储单元,以便存储'\0'。
如果省略对数组的长度的声明,例如:
char std2[]={'c' 'h' 'i' 'n' 'a' '\0'};
那么系统默认的std2数组的长度为6。而对于
char std3[]={'c' 'h' 'i' 'n' 'a' '\0'};
系统默认的std3数组的长度为5.由于初始化列表的末尾没有字符串结束标志'\0',也没有多余的空间供系统自动添加字符串结束字符'\0',因此,这时定义的std3仅仅是一个长度为5的字符数组,不能把它当作字符串来使用。由此可见,一个字符型一维数组并不一定是一个字符串,只有当字符型一维数组中的最后一个元素值为'\0'时,它才构成字符串。按照上面这种方式给字符数组赋初值时,必须人为加入'\0',才能将其作为字符串来使用。
用字符串常量直接对数组初始化
C语言允许用字符串常量直接初始化一个字符数组。例如:
char std[6]={"china"};
也可以这样:
char std[6]="china";
这时,数组定义的长度应大于等于字符串中包括'\0'在内的字符个数。而下面的语句;
char std[5]={"china"};
这是不正确的。因为存储字符串“china”至小需要6个字节的存储单元,当长度声明为5时,将会因存储空间不足而无法存放'\0',从而使系统无法将std按字符串来处理。
小贴士:为了用字符数组来存储长度为N的字符串,数组长度至少定义为N 1,其中前N个元素用于存放字符串的N个实际字符,而最后一个元素用于存放字符串结束标志。
定义数组时,若省略长度声明,则编译程序将自动按初始化列表内提供的初始值的个数定义数组的长度。例如:
char std[]={"china"};(或char std[]="china";)
由于"china"是字符串常量,系统自动在其尾部加入'\0',因此系统默认数组std的长度为6.
对于用二维字符数组存放多个字符串的情形,第二维的长度不能省略,应按最长的字符串长度设定,第一维的长度代表要存储的字符串的个数,可以省略。例如:
char weekday[7][10]={"Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday"};
(或char weekday[7][10]={"Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday"};
)
但决不能写成这样
char weekday[][]={"Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday"};
数组weekday初始化后的结果
数组weekday的每行都有10个元素,当初始化字符串长度小于10时,系统自动为其后的元素赋初值'\0'。
字符数组的输入和输出
在定义字符数组std以后,可以有以下三种对其进行输入和输出
(1)按c格式符一个一个字符地单独输出
如果已知字符的实际长度,则可以使用下面的方法进行字符串的输入和输出
for(i=0;i<10;i )//不建议使用的字符数组输入方式
{
scanf("%c" &std[i]);
}
for(i=0;i<10;i )//不建议使用的字符数组输出方式
{
printf("%c" std[i]);
}
由于字符串结束标志'\0'能够标志字符的结束,因此可用字符串的输出操作。输出时,依次检查取出的每个元素std是否为'\0' 若是,则停止输出。
for(i=0;std[i]!='\0';i )//建议使用的字符数组输出方式
{
printf("%c" &std[i]);
}
(2)按s格式符将字符串作为一个整体输入和输出,例如:
输入
scanf("%s" std);
输出
printf("%d" std);
用函数scanf()按s格式符输入一个字符串时,必须注意以下三点:
1.因为字符数组名本身代表该数组存放的字符串的首地址,所以scanf语句的%s格式输入字符串时,字符数组名的前面不能再加取地址运算符,其后也不需用方括号指出数组元素的下标。
2.因为要在保存到字符数组中的字符串末尾添加一个字符串结束标志,所以在定义字符数组的大小时,要为字符串结束符预留出一字节的存储单元,定义的字符数组的大小要比实际存储的字符串的长度大一字节。当然,在用户输入字符串时,也要确保输入的字符串的长度不超过数组所能容纳的字符串的长度,否则将会出现缓冲区溢出。
3.因为scanf()函数不断地接收用户从键盘输入的字符,并将起保存到字符数组中,直到接收到的字符是一个空格、回车换行符、制表符(Tab)或文件结束符EOF为止,所以空格、回车换行符或制表符作为按%s格式输入字符串的分隔符,不能读入,在输入中遇到这些空白字符时,系统认为字符串输入结束。
(3)用字符串处理函数gets()或puts()输入或输出一个字符串
函数gets()和puts()是C语言提供的标准输入/输出函数,因此,在使用这两个函数时,应在程序的开头处加上文件包含编译预处理命令:
#include<stdio.h>
函数gets()用于从键盘输入一个字符串(包括空格符),并保存到圆括号内的参数所代表的存储单元中,函数的返回值为字符串的首地址。函数puts()用于圆括号内的参数给出的地址开始,依次输出存储单元中的字符,当遇到第一个'\0'时输出结束,并且自动输出一个换行符。