人在键盘中打字,此时数据传输到了键盘缓冲区中,当按下回车时,数据会传输到输入流缓冲区中。此时,scanf会从输入缓冲区中读取数据,它的返回值是输入数据的个数。
如果有两个整数等待输入,可以采取:
1.输入一个整数,再按回车,再输入一个整数。此时第一个数据x的值就先从键盘缓冲区传进输入缓冲区,等到第二个输入之后再按回车,再从键盘缓冲区传入输入流缓冲区。
2.一行输入两个整数,再按回车,此时一起传入了输入流缓冲区。
int x, t;
scanf("%d%d", &x, &t);
当缓冲区中一旦有数据,scanf就开始读取,如情况1,因为输入x之后立马回车,输入流缓冲区之中有一个数据x,但是scanf要求读取的数据为两个,此时因为scanf是阻塞函数,所以挂起等待。当情况2时,缓冲区中存了两个,就直接读取返回了。
如果出现以下情况:
int x, t;
cout<<scanf("%d%d", &x, &t);
int q;
scanf("%d", &q);
cout << q;
一口气输入了1,2,3三个数字,按下回车,只从缓冲区中读了1,2。此时3还滞留在缓冲区中,直接再调用一次scanf函数就把缓冲区中剩下的那个数据读取了。
一个需要注意的问题:当使用cin之后,接下来调用getline为什么无效?
当输入数字之后,按下回车,此时数字被从键盘缓冲区读取到了输入流缓冲区,然而此时,换行符"\n"却留在了键盘输入缓冲区,如果接下来调用一个getline,此时,打下个字符串"qwq",会跟之前的"\n"一起发给输入流缓冲区中,然而此时调用getline函数,只读取一行,读取到了"\n",getline是不会把"\n","\0"," ",写入字符串中,所以此时字符串仍然是空,如果要解决这个问题:
方法1.cin之后直接调用cin.ignore()清空键盘缓冲区
方法2.getline读取了"\n"之后再调用一次getline,此时就可以把需要的字符串读出来了。