符数组的定义
char 数组名[长度]
char 表示数组元素的类型为字符类型,存储字符
数组名表示数组首元素的地址
字符数组的主要用途---->存储字符串,
字符数组的初始化
1)字符数组可以进行部分初始化,系统默认未被初始化的元素赋值为0-------’\0’空字符
2)初始化时,长度可以省略不写,分配的空间的大小由初始化列表中的元素来决定
3)字符数如果只定义不赋值,则系统默认为随机值
插播字符串的特点:
由多个字符组成,并由’\0’作为结束符
字符串不是一种数据类型
字符数组可以存储字符串
字符串是用双引号括起来
如何区分字符数组,还是字符串?----->字符串的结束符一定是’\0’
字符数组的赋值 ,初始化 ,引用
借助于字符数组存储字符串的方式:
以及如何存储字符数组
#include <stdio.h>
int main()
{
char a[5] = {'h','e','l','l','o'}; //字符数组进行完全初始化
printf("%c\n",a[4]); //字符--->数组名[下标]
char b[5] = {'h','e','l'};
//字符数组进行部分初始化---->字符串,不管字符数组中有几个'\0,只要有'\0,则可以组成字符串
printf("%c\n",b[4]); //字符元素为'\0'
printf("%s\n",b);//表示打印以a作为字符串的首地址开始依次打印直到遇到'\0结束打印
//打印字符串,%s的格式
}
输出结果:
[csy@local array_str]$ ./str
o
hel
部分初始化:
#include <stdio.h>
int main()
{
char a[12] = {'h','e','l','l','o','\0','w','o','r','l','d'}; //部分初始化
printf("%s\n",a); //以a作为首地址开始依次打印,直到遇到'\0'结束打印
printf("%s\n",a+2); //以a+2位首地址开始依次打印字符串
return 0;
}
输出结果:
[csy@local array_str]$ ./str2
hello
llo
字符串
字符串存储方式:
1)字符串存储单个字符,用’\0’作为结束符
2)char 数组名[长度]= {“字符串”}
3)char 数组名[长度]= “字符串”;
说明:字符串的元素的个数,并且要加上’\0’总的个数不能超过元素的长度
字符串不能再字符数组定义之后,对其进行整体赋值字符串
错误示范:
char a[13];
a[13] = “hello world”; //不符合语法规则
a = “hello world”; //不符合语法规则
注意:
scanf(“%s”,a); //表示以a作为首地址,将字符串输入,当键入回车键之之前,系统会自动加’\0’
char a[] = “hello world” //所占空间大小为12个字节,因为’\0’也算一个字符,占一个字节
举个栗子
区分下面的字符数组是字符串还是字符数组,或者是不符合定义.
0) char str[10];
str[0] = ‘h’;
str[1] = ‘e’;
str[2] = ‘l’;
str[3] = ‘l’;
str[4] = 0; //字符串
1)char str[10]=”hello world”; //不符合定义,字符串长度超过规定空间
2)char str[10]={“hello”}; //字符串
3)char str[10]={‘1’,’2’,’3’,’e’,’r’,’i’,’o’}; //字符串
4)char str[5]={‘1’,’2’,’3’,’4’,’5’}; //字符数组
5)char str[5]={‘y’};//字符串
6)char str[5]=”hello”; //不符合定义,超过规定长度
7)char str=”world”; //不符合定义,长度未写
8)char str[6]=”hello”; //字符串
9)char str[16]=”hello world”; //字符串
10)char str[6]; str[6]=”hello”; //不符合定义,不能除了初始化以外对其进行整体赋值
11) char str[10]={0}; //
str[0] = ‘h’;
str[1] = ‘e’;
str[2] = ‘l’;
str[3] = ‘l’; //字符串
下面栗子引用自https://www.cnblogs.com/Luthais/p/10218834.html 很好的说明了字符串和字数数组大小的关系。
#include <stdio.h>
#include <string.h>
int main(void)
{
/*字符数组赋初值*/
char cArr[] = {'I','L','O','V','E','C'};
/*字符串赋初值*/
char sArr[] = "ILOVEC";
/*用sizeof()求长度*/
printf("cArr的长度=%d\n", sizeof(cArr));
printf("sArr的长度=%d\n", sizeof(sArr));
/*用strlen()求长度*/
printf("cArr的长度=%d\n", strlen(cArr));
printf("sArr的长度=%d\n", strlen(sArr));
/*用printf的%s打印内容*/
printf("cArr的内容=%s\n", cArr);
printf("sArr的内容=%s\n", sArr);
return 0;
}
输出结果为
[csy@local array_str]$ ./size
cArr的长度=6
sArr的长度=7
cArr的长度=10
sArr的长度=6
cArr的内容=ILOVEC��
sArr的内容=ILOVEC
[csy@local array_str]$
从代码及其运行结果中可以看出如下几点。
首先,从概念上讲,cArr 是一个字符数组,而 sArr 是一个字符串。因此,对于 sArr,编译时会自动在末尾增加一个 null 字符(也就是’\0’,用十六进制表示为 0x00);而对于 cArr,则不会自动增加任何东西。
记住,这里的 sArr 必须是“char sArr[7]=“ILOVEC””,而不能够是“char sArr[6]=“ILOVEC””。
其次,“sizeof()”运算符求的是字符数组的长度,而不是字符串长度。因此,对于“sizeof(cArr)”,其运行结果为 6;而对于 sizeof(sArr),其运行结果为 7(之所以为 7,是因为 sArr 是一个字符串,编译时会自动在末尾增加一个 null 字符)。因此,对于以下代码:
/*字符数组赋初值*/
char cArr[] = {'I','L','O','V','E','C'};
/*字符串赋初值*/
char sArr[] = "ILOVEC";
也可以写成如下等价形式:
/*字符数组赋初值*/
char cArr[6] = {'I','L','O','V','E','C'};
/*字符串赋初值*/
char sArr[7] = "ILOVEC";
最后,对于字符串 sArr,可以直接使用 printf 的 %s 打印其内容;而对字符数组,很显然使用 printf 的 %s 打印其内容是不合适的。
通过对以上代码的分析,现在我们可以很简单地得出字符数组和字符串二者之间的区别:
对于字符数组,其长度是固定的,其中任何一个数组元素都可以为 null 字符。因此,字符数组不一定是字符串。
对于字符串,它必须以 null 结尾,其后的字符不属于该字符串。字符串一定是字符数组,它是最后一个字符为 null 字符的字符数组。