关于#c语言#的问题,如何解决?

img


假如输入ACM但是它输出的不是A C M
但是单独运行就可以实现
希望告诉原因。

scanf() 是带有缓冲区的。
键盘输入的东西并没有直接给scanf读取 而是在缓冲区进行暂时存放。
为scanf以回车键为信号,去缓冲区进行读取数据,只要数据的格式符合标准,那么就可以正确读取,否则就要等待继续输入/读取失败
通过查阅资料我们知道了,scanf函数是标准输入流(从键盘接收数据),接收的数据放入输入缓冲区中,其中就包括在键盘输入的空格、回车这类字符,
当你用%d接收时是不会影响的,但是用%c就会产生错误,这是因为在"%c"输入时,空格和转义字符均被视为有效字符会被%c接收。从而导致输出错误,无法AC
一开始你输入20个字符,然后按回车键查看结果,此时缓冲区里面有回车键,你再输入ACM,缓冲区内的是回车键ACM回车键,但因为读取三位,所以读取的是回车键AC,打印出来是 A C,而不是A C M.
你可以验证一下用scanf读取四个字符,但输入三个,就会发现打印出来是ACM了。

img

所以想要解决问题的话可以加个getchar();把缓冲区给清空。

#include<stdio.h>
int main()
{
    char a[2];
    int i;
    char j, k, l;

    printf("请输入字符\n");
    
    for ( i = 0; i < 2; i++)
    {
        scanf("%c", &a[i]);
    }

    for  (i = 0; i < 2; i++)
    {
        printf("%c", a[i]);
    }
    printf("\n");
    getchar();
    scanf("%c%c%c", &j, &k, &l);
    printf("%c %c %c", j, k, l);


    return 0;
}

img

这是因为使用scanf通过%c获取字符时,空格键,回车键都会当成字符读入。