重温C语言 | 字符数组和字符串

符数组的定义

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 字符的字符数组。

发布了65 篇原创文章 · 获赞 36 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_40860986/article/details/95539416