scanf,getline输入

人在键盘中打字,此时数据传输到了键盘缓冲区中,当按下回车时,数据会传输到输入流缓冲区中。此时,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,此时就可以把需要的字符串读出来了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值