scanf以不同于变量类型的格式描述符输入时,如何运作?

问题

scanf以不同于变量类型的格式描述符输入时,是怎么运作的?有个同学问了我这样的代码,一时间想不到原因。

代码

int main()
{
    int x;
    char y,z;
    scanf("%c%c%d",&x,&y,&z);
    
    printf("\tAscii\tchar\n");
    printf("x:\t%d\t%c\n",x,x);
    printf("y:\t%d\t%c\n",y,y);
    printf("z:\t%d\t%c\n",z,z);
    return 0;
}

输入

96 97 98

运行结果:

img

环境

Windows 10
MinGW GCC 11.2.0 64-bit Debug

(gdb) p &x
$8 = (int *) 0x7fffffffe2bc
(gdb) p &y
$9 = 0x7fffffffe2bb ""
(gdb) p &z
$10 = 0x7fffffffe2ba "a"
(gdb)

x的地址是 0x7fffffffe2bc, y的地址是 0x7fffffffe2bb, z的地址是 0x7fffffffe2ba
最后以%d给z赋值的时候覆盖了,x和y的值

%c格式期望后面参数类型是char*,而你传入的是int*

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^