美文网首页
scanf("%3c%3c", &a, &b)

scanf("%3c%3c", &a, &b)

作者: 许可欣小同学 | 来源:发表于2018-09-23 02:22 被阅读0次

    问题

    在书中看到这样的描述:



    我们按照这个来操作一下:

    代码

    #include<stdio.h>
    
    int main(int argc, char const *argv[])
    {
        char a, b;
        scanf("%3c%3c\n", &a, &b);
        printf("a = %c b = %c\n", a, b);
    
        return 0;
    }
    

    输入:

    abcdefg
    

    输出:

    a = e b = d
    

    跟我们期望中有点不一样,我们希望他的结果是:a = a b = d,为什么会这样呢 ?

     

    解答

    这跟a b在内存中的地址是有关的
    我们先看一下a b的地址:

    #include<stdio.h>
    
    int main()
    {
        char a, b;
        printf("a = %p\nb = %p\n", &a, &b);
    
        return 0;
    }
    

    输出:

    a = 0x7ffeebfb5bcb
    b = 0x7ffeebfb5bca
    

    a的地址值比b的大,说明a的地址在b的后面,也就是&a = &b + 1&是取址符);

    a b的位置如下图所示,一个地址(1个字节)存一个字符:

    a b的位置示意

    把字符读进a的时候

    从左到右读入:


    读入a

    分别将字符a, b, c写进~cc~cd~ce里面

    把字符读进b的时候

    也是从左到右读入

    读入b
    分别将字符d, e, f写进~ca~cb~cc里面。
    注意!
    原本地址~cb里面的a被新写入的e覆盖
    原本地址~cc里面的b被新写入的f覆盖

    打印a、b

    因为char a的地址是~cb, ~cb里面现在是e
    char b的地址是~ca, ~ca里面现在是d

    输出结果

    所心输出当然是:

    a = e b = d
    

     
    也可以验证一下,输出a地址右边那个地址里面的数,理论上应该是f

    #include<stdio.h>
    
    int main(int argc, char const *argv[])
    {
        char a, b;
    
        scanf("%3c%3c\n", &a, &b);
    
        printf("a = %c b = %c a右边那个字符是:%c\n", a, b, *(&a + 1));
        return 0;
    }
    

    输出结果:

    a = e b = d a右边那个字符是:f
    

    没错,就是这样。

    相关文章

      网友评论

          本文标题:scanf("%3c%3c", &a, &b)

          本文链接:https://www.haomeiwen.com/subject/dcdfoftx.html