鱼C论坛

 找回密码
 立即注册
查看: 2649|回复: 8

[已解决]Linux 系统如何清空 stdin 缓冲区

[复制链接]
发表于 2022-11-29 15:23:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如题,网上的 fflush(stdin), cin.sync() 怎么都不管用

事情是这样的,我要做一个程序,程序中要求用户输入两行数字,格式就如这样:
  1. a
  2. b
复制代码

但是,因为我担心用户第一行会不按要求输入很多数字,因此,我想在读入b 之前清空 stdin 缓冲区,我就这样做了:

  1. ...
  2. int a, b;
  3. scanf("%d", &a);
  4. fflush(stdin);
  5. scanf("%d", &b);
  6. //对 a, b 进行若干操作...
复制代码

但是,这个代码放在 windows 没有事,在 Linux 就出问题了

输入:
  1. 3 4444 4 2 3 3
  2. 8
复制代码

windows 输出:
  1. 8
复制代码

Linux 输出:
  1. 4444
复制代码


很明显,fflush(stdin) 在 linux 系统中并不能清空 stdin 的缓冲区,网上搜的 cin.sync() 也不对,那么该到底怎么写呢
最佳答案
2022-11-29 15:33:45
  1. #include <iostream>
  2. #include <limits>

  3. using std::cin, std::cout, std::endl;
  4. using std::numeric_limits;
  5. using std::streamsize;

  6. int main() {
  7.     char ch; cin >> ch;
  8.     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  9.     cin >> ch;
  10.     cout << ch << endl;
  11.     return 0;
  12. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-29 15:33:45 | 显示全部楼层    本楼为最佳答案   
  1. #include <iostream>
  2. #include <limits>

  3. using std::cin, std::cout, std::endl;
  4. using std::numeric_limits;
  5. using std::streamsize;

  6. int main() {
  7.     char ch; cin >> ch;
  8.     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  9.     cin >> ch;
  10.     cout << ch << endl;
  11.     return 0;
  12. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-29 15:34:16 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-29 15:35:54 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-29 15:36:30 | 显示全部楼层

换行之后就好像假死了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-29 15:37:53 | 显示全部楼层

马上,稍等,总感觉不对,我再调试调试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-29 15:39:01 | 显示全部楼层
  1. sh-5.1$ uname -srmo
  2. Linux 6.0.6-arch1-1 x86_64 GNU/Linux
  3. sh-5.1$ cat main.cpp
  4. #include <iostream>
  5. #include <limits>

  6. using std::cin, std::cout, std::endl;
  7. using std::numeric_limits;
  8. using std::streamsize;

  9. int main() {
  10.     char ch; cin >> ch;
  11.     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  12.     cin >> ch;
  13.     cout << ch << endl;
  14.     return 0;
  15. }
  16. sh-5.1$ g++ -g -Wall -o main main.cpp
  17. sh-5.1$ ./main
  18. 1234
  19. abcd
  20. a
  21. sh-5.1$
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-29 15:40:08 | 显示全部楼层

不好意思,刚刚调试错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-29 15:40:40 | 显示全部楼层
zhangjinxuan 发表于 2022-11-29 15:37
马上,稍等,总感觉不对,我再调试调试

cin都清空了,第14行要求输入一个ch,你没有输入,当然就在那里一直等着了

评分

参与人数 1鱼币 +5 收起 理由
zhangjinxuan + 5 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 02:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表