关于字符数组中的‘\0’存在性和配合scanf函数的问题。

①第一种定义字符串变量的方式

        char 类型数组来存储。(因为c语言中没有字符串类型,只有字符串转换说明,即%s)

char arr[3] = "abc";//a[0] == 'a' 、 a[1] == 'b' 、 a[2] == 'c'

        代码验证:


		
    char arr[3] = "abc";//注意:这里的数组长度是3

    int num1 = 0;

    int i = 0;//索引
    for(i = 0; i < 3;++i)
    {
        if ('\0' == arr[i])//如果有'\0',则num1加1
            num1++;
    }

    printf("num1 = %d",num1);//输出num1的值

        运行结果:

        


char arr[4] = "abc";//a[0] == 'a' 、 a[1] == 'b' 、 a[2] == 'c'、a[3] == '\0'

        代码验证:

    char arr[4] = "abc";//注意:这里的数组长度是4

    int num1 = 0;

    int i = 0;//索引
    for(i = 0; i < 4;++i)
    {
        if ('\0' == arr[i])//如果有'\0',则num1加1
            num1++;
    }

    printf("num1 = %d",num1);//输出num1的值

        运行结果:

(以上是两种不一样的写法,都是正确的。)


②第二种定义字符串变量的方式:

        char ch[ ] = "abc";//虽然没有写数组长度,但是它会根据你的字符串长度自动为你开辟空间。
                    //a[0] == 'a' 、 a[1] == 'b' 、 a[2] == 'c'、a[3] == '\0'

        代码验证:

    char arr[] = "abc";

    int num1 = 0;

    int i = 0;//索引
    for(i = 0; i < 4;++i)
    {
        if ('\0' == arr[i])//如果有'\0',则num1加1
            num1++;
    }

    printf("num1 = %d",num1);//输出num1的值

        运行结果:


③第三种定义字符串变量的方式:

char ch[ ]  = { 'a','b','c'};//也可以用%s输出
                          //a[0] == 'a' 、 a[1] == 'b' 、 a[2] == 'c'
(这种末尾不带‘\0’)

        代码验证:

    char arr[] = {'a','b','c'};

    int num1 = 0;

    int i = 0;//索引
    for(i = 0; i < 4;++i)
    {
        if ('\0' == arr[i])//如果有'\0',则num1加1
            num1++;
    }

    printf("num1 = %d",num1);//输出num1的值

        运行结果:

                        (这种末尾不带‘\0’)

        (注意:如果一个字符串末尾没有\0结束标记,就会往后输出以垃圾值转化为字符的字符,解决方式:在末尾加个\0转义字符就行了,还有\0这个字符是不能显示打印的,但拆开就可以)

但是:

        char ch[4] = {'a','b','c'}这种末尾是带‘\0’;

        代码验证:

    char arr[4] = { 'a','b','c' };

    int num1 = 0;

    int i = 0;//索引
    for(i = 0; i < 4;++i)
    {
        if ('\0' == arr[i])//如果有'\0',则num1加1
            num1++;
    }

    printf("num1 = %d",num1);//输出num1的值

        运行结果:


        char ch[ ] = "";不能用scanf()函数存入字符串,因为会使ch周围的堆栈损坏

        代码验证:

    char arr[] = "";

    scanf("%s", arr);

    printf("num1 = %s",arr);

        运行结果:

 但是:

        同时也有两个异常信息:

        

        

 上面这张图的意思是:运行时检查失败#2 -变量“arr”周围的堆栈已损坏。(内存越界访问的意思)

        这种写法会导致一开始没有定义数组长度,由他自己认定数组长度为常量length,那么程序运行到结束的过程中,它的数组长度依旧是length,不会变,所以用scanf()并不会改变数组ch的长度,所以这种写法如果遇到要修改数组长度,不要写!!!


以下是有关这方面的笔记:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小艺术生◎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值