字符数组与字符串数组

C语言中:

字符数组与字符串数组的定义

字符数组是一个存放字符的数组

字符串数组是一个特殊的字符数组,它以’\0’(ASCII 为0)结尾

我们不能通过字符数组名知道数组内有多少成员,但可以通过字符串数组名计算数组内的成员数量

这里对字符数组(强调:字符串数组是一个特殊的字符数组)计算有一个关键字 sizeof,和一个函数 strlen:

sizeof 计算的是字符数组占用空间的大小(这里除以每个成员占用空间的大小就可以进行计算成员数量,但这个数量是一个最大成员数量,实际可能并没有填满)

strlen 以’\0’做为结束标志来计算成员数量

所以strlen可以进行计算字符串数组的成员数量,但不能计算字符数组的成员数量

即使使用strlen计算普通字符数组成员大小计算出了正确结果,那也是字符数组结尾的下一个内存地址空间内存储的正好是 0 ,所以不能使用这种方法计算成员数量

而这里的sizeof由于是用来计算字符数组占用空间大小的,所以理想情况下字符串数组的sizeof是比strlen多1的(用来存放’\0’),但另一种情况也很多,如果一开始就定义char a[20]那么它就是占用20BYTE,不会变化,而strlen则可能是小于20的任何数(不考虑溢出)

字符数组与字符串数组区分

什么时候字符数组是一个字符串数组,而什么时候就是一个普通字符数组呢?

注意: 正常况下,如果字符数组的可容纳成员数量大于字符数组的成员数量,那就会自动追加’\0’(可以理解为:添加数据前字符数组所有成员都被初始化为0,不考虑溢出)

这里如果使用scanf进行%s输入,,应为输入的就是一个char *字符串,所以即使溢出,它也会给你进行追加’\0’,所以这样做很不安全

特殊的,如果使用char a[]={‘a’, ‘b’, ‘c’, ‘d’}这里不会自动补0,所以如果在这里以 %s 打印数组a就会出现乱码(找不到正确的结束符,但可以通过%c一个一个的进行输出,但必须知道成员数量),而如果使用char a[5]={‘a’, ‘b’, ‘c’, ‘d’}会自动填零,但需要注意,成员数量必须小于数组大小(至少留一个空间填零),不然同样会出现上述情况

同理我们在用字符串对字符数组进行初始化时若使用:char a[5]=”abcde”时同样不对,虽然字符串的长度为成员数量,但字符串总是以0结尾,所以字符数组的大小要比字符串长度多1,这里如果这样使用编译器应该会直接报错(越界)。所以要拿字符串直接初始化字符数组时可以使用char a[]=”aaaaaa” ,这样会比较方便,sizeof(a)为7,strlen(a)为6

还有就是sizeof是c语言的关键字,不需要包含头文件,strlen需要包含string.h头文件

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值