zhangjinxuan 发表于 2022-11-29 15:23:30

Linux 系统如何清空 stdin 缓冲区

如题,网上的 fflush(stdin), cin.sync() 怎么都不管用{:10_266:}

事情是这样的,我要做一个程序,程序中要求用户输入两行数字,格式就如这样:
a
b
但是,因为我担心用户第一行会不按要求输入很多数字,因此,我想在读入b 之前清空 stdin 缓冲区,我就这样做了:

...
int a, b;
scanf("%d", &a);
fflush(stdin);
scanf("%d", &b);
//对 a, b 进行若干操作...

但是,这个代码放在 windows 没有事,在 Linux 就出问题了 {:10_282:}

输入:
3 4444 4 2 3 3
8
windows 输出:
8
Linux 输出:
4444

很明显,fflush(stdin) 在 linux 系统中并不能清空 stdin 的缓冲区,网上搜的 cin.sync() 也不对,那么该到底怎么写呢{:10_266:}

人造人 发表于 2022-11-29 15:33:45

#include <iostream>
#include <limits>

using std::cin, std::cout, std::endl;
using std::numeric_limits;
using std::streamsize;

int main() {
    char ch; cin >> ch;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cin >> ch;
    cout << ch << endl;
    return 0;
}

zhangjinxuan 发表于 2022-11-29 15:34:16

人造人 发表于 2022-11-29 15:33


试过,错了{:10_266:}

人造人 发表于 2022-11-29 15:35:54

zhangjinxuan 发表于 2022-11-29 15:34
试过,错了

?

zhangjinxuan 发表于 2022-11-29 15:36:30

人造人 发表于 2022-11-29 15:35
?

换行之后就好像假死了{:10_250:}

zhangjinxuan 发表于 2022-11-29 15:37:53

人造人 发表于 2022-11-29 15:35
?

马上,稍等,总感觉不对{:10_277:},我再调试调试

人造人 发表于 2022-11-29 15:39:01

zhangjinxuan 发表于 2022-11-29 15:34
试过,错了

sh-5.1$ uname -srmo
Linux 6.0.6-arch1-1 x86_64 GNU/Linux
sh-5.1$ cat main.cpp
#include <iostream>
#include <limits>

using std::cin, std::cout, std::endl;
using std::numeric_limits;
using std::streamsize;

int main() {
    char ch; cin >> ch;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cin >> ch;
    cout << ch << endl;
    return 0;
}
sh-5.1$ g++ -g -Wall -o main main.cpp
sh-5.1$ ./main
1234
abcd
a
sh-5.1$

zhangjinxuan 发表于 2022-11-29 15:40:08

人造人 发表于 2022-11-29 15:39


不好意思,刚刚调试错了{:10_282:}

人造人 发表于 2022-11-29 15:40:40

zhangjinxuan 发表于 2022-11-29 15:37
马上,稍等,总感觉不对,我再调试调试

cin都清空了,第14行要求输入一个ch,你没有输入,当然就在那里一直等着了
页: [1]
查看完整版本: Linux 系统如何清空 stdin 缓冲区