C语言中字符串结束符探究

#include <stdio.h>
#include <string.h>
int main()
{
        char *a = "hello world";
        int i = 0;
        for(i = 0; i < 12; i++)
                if(a[i] == '\0')
                        printf("\\0\n");
                else
                        putchar(a[i]);
//输出结果为:hello world\0    表明字符串常量最后默认会添加一个'\0'这个字符串结束符。
        printf("\n");
        printf("The length of \"hello world\" = %d\n",strlen(a));  
//输出结果为: 11   。表明strlen不包括'\0’这个字符串结束符。
        printf("\n");

        char buf[10] = "helle world";
        for(i = 0; i < 11; i++)
                if(buf[i] == '\0')
                        printf("\\0\n");
                else
                        putchar(buf[i]);
/**输出为 hello worl@     。输出了11个字节。最后一个字节不是'\0',而是@(这个字节是随机的)。
从上面情况可以看出,将数组中赋值字符串常量时,如果字符串常量长度大于数组长度,数组最后一位并不是'\0',如果字符串常量长度小于数据长度,那么数据中剩余部分将会用'\0'补全。如buf[10] = "hello",那么buf的buf[5] ---buf[9]都将会被填充为'\0'
**/
        printf("\n");
        char *b = "hello world";
        char ba[10] = "hello world";
        printf("&a = %p,&b = %p,&buf = %p,&ba = %p \n",a,b,buf,ba);
        if(*(a+11) == '\0')
                printf("\\0\n");
        return 0;
}


1. 从“hello worl@”输出结果可以看出,数组可以容纳的最大字符串数并不是数组长度-1,而是数组的长度。

2. “hello world”这个字符串常量有一个固定的地址,a指针和b指针都指向了字符串常量“hello world”的地址。并且a+11的地址内容为‘\0'(a+10地址内容为’d')说明,字符串常量占用的字节数确实是字符串常量长度+1,最后一位为'\0'。

3.那么为什么当数组长度小于字符串常量长度时,数组中最后一位容纳的不是'\0'?,且数组首地址并不是指向"hello world"字符串常量地址,说明在定义数组时,开辟了一个内存空间,当把字符串常量赋值给数组变量时,将字符串常量内容复制到数组变量自己的内存中,如果字符串常量长度大于数据长度,那么大于数组长度部分将会被忽略,当数组长度大于字符串常量长度时(字符串常量长度为strlen值+1),数组中未填充部分将以'\0'补充。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hzwy23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值