关于c语言中 scanf 对多行字符的输入问题

如果想直接看解决办法,直接点击目录中的结果处

文章目录

  • 前言:
    • 问题:
        • 原因:
        • 尝试改进:
    • 新问题:
        • 原因:
        • 最后解决办法:
          • 思路:
        • 结果

前言:

我想大家在做一些PTA题的时候,有的时候需要输入多行字符,例如:

A	B
C 	D
W	Q

在这些多行输入中如果使用scanf的%c来格式输入时:

int main()
{
     
    char ch1, ch2;
    for (int i = 0;i < 3;i++) {
     
        scanf("%c %c", &ch1, &ch2);
        //char a = getchar();
        printf("ch1=%c\n", ch1);
        printf("ch2=%c\n", ch2);
    }
}

问题:

在这里插入图片描述
可以看到如果scanf("%c %c", &ch1, &ch2); 输入时有的字符为空

原因:

因为在cmd中每行我们输入完了该输入下一行时会使用回车
然后鸡贼的scanf也把回车当成了一个字符给了我们的变量

尝试改进:

那咋办么,我想输入多行字符,那scanf又要截取我的回车。。。(那我就让他截取)没错,这个时候你一定想到了在每次输入时在scanf中加入\n比如:

scanf("%c %c\n",&a, &b);

在这里插入图片描述

新问题:

然后你会发现特扯的事情:当你输入第一行时,你发现此时应该输出的值没有输出,
你输入第二行的时候,输出的值是第一行的值,最恶心心的来了:当你输入完三行后按回车发现程序不会退出(图中蓝色部分是我狂按回车)但是随便输入一个值后再按回车我们才能看到第三行的输出与程序的退出
(没错,此时的你一定更我一样百思不得其解,差点当场自闭)

原因:

我查了好多博客等相关资料,得到的解释是:

  1. 先理解scanf的输入:
    我们输入的数据是先存放在“缓冲区”,可以把它理解为一个队列。输入数据从队列的右端进入,而scanf读取数据是从队列的左端取出。注意:与格式控制符不匹配的数据还停留在缓冲区中。
  2. 接下来看什么程序只有在输入一个无效的字符,回车后才能退出
    当我键盘录入 ‘ %c %c\n ’的时候,输入的前两个字符会被读取到并且赋值给变量,后面的回车会被scanf拿去 (看看这不就是我们要做的吗 )
    但是问题就在于:此时缓冲区里是一片空白,然而程序结束需要读到缓冲区里任意一个回车才可以结束。
    但是我不是输入了很多空格么? 这个是scanf读取有效字符的问题:比如,scanf要读取到有效的整型,会跳过开头的一切回车和空白,直到遇到整型才会纳入赋值给相应变量,然后再遇到回车才会结束这条语句。所以接着刚问题,缓冲区中是空白的时候,就是给一万个\n ,scanf语句会把它视为开头的空白,是不会读取的,所以要加入一点东西,跳过这个开头的空白,再给回车才有效果。所以它才会一直等待你输入一点东西。

最后解决办法:

听完我在上上面的解释后,你发现你还是不知道如何解决这种让你吐血的问题(嘿嘿):

思路:

思路与原来相同就是想办法把没用的回车给吸收了:
使用getchar()就可以了(因为吸收了回车,所以没有必要在scanf中写\n)

int main()
{
     
    char ch1, ch2;
    for (int i = 0;i < 3;i++) {
     
        scanf("%c %c", &ch1, &ch2);
        char a = getchar();//为了吸收多余的回车字符
        printf("ch1=%c\n", ch1);
        printf("ch2=%c\n", ch2);
    }
}

结果

关于c语言中 scanf 对多行字符的输入问题_第1张图片

你可能感兴趣的:(笔记,c语言)