C语言scanf输入问题

#include <stdio.h>
int main()
{
    int x1,x2;char y1,y2;
    scanf("%2d%3d%3c%c",&x1,&x2,&y1,&y2);
    printf("x1=%d,x2=%d,y1=%c,y2=%c\n",x1,x2,y1,y2);
    return 0;
}

若输入数据是9876543210,为什么编辑器上的输出结果是x1=98,x2=12851,y1=4,y2=1
而不是x1=98,x2=765,y1=4,y2=1呢

%3d 表示要读取一个整数,但最多只读取3个字符
建议改scanf格式

scanf("%2d%4d%3c%c",&x1,&x2,&y1,&y2);


【以下回答由 GPT 生成】

问题的关键在于scanf函数的格式控制字符串中使用了%3c来读取字符。在%3c的前面,我们使用了%2d%3d来读取整数,这两个格式符会将输入缓冲区中的相应字符从左到右依次赋值给整数变量。但是当scanf遇到%3c时,它会从输入缓冲区中读取一个字符,并将其赋值给字符变量,但不会消耗输入缓冲区中的换行符和空格字符。

所以在你的代码中,输入9876543210时,%3c会将字符9赋值给y1,然后将缓冲区中的字符8赋值给y2。而9876543210后面的764依然留在了输入缓冲区中,没有被消耗。

具体解决方案如下:

#include <stdio.h>

int main()
{
    int x1,x2;
    char y1,y2;
    scanf("%2d%3d",&x1,&x2);  // 删除%c
    scanf(" %3c%c",&y1,&y2);  // 添加一个空格
    printf("x1=%d,x2=%d,y1=%c,y2=%c\n",x1,x2,y1,y2);
    return 0;
}
  1. 我们删除了原本的%3c%c,改为了%3c
  2. 在第二个scanf中,我们添加了一个空格符" ",它的作用是忽略换行符、空格等空白字符,从而读取到输入缓冲区中的字符。

这样做的话,当输入9876543210时,输出结果将是x1=98,x2=765,y1=4,y2=1,与预期一致。


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