清除stdin缓冲区(内存占用)

时间:2013-07-30 18:23:17

标签: c++ c memory stdin core

在我的情况下,我的应用程序的用户被要求输入他们的密码来启动它。要获取密码,我只需使用:

char c;  
std::string password;
while ...  // until the end of entry
{
    c = fgetc(stdin);
    password += c;
}

检查密码后,我销毁变量,因此无法使用我的程序的核心图像检索它。例如,如果某人使用“gcore”命令,然后在生成的核心中搜索密码,则无法找到它。

但在我的情况下,我仍然可以检索密码值,因为它似乎仍然在stdin缓冲区中。

所以我的问题是如何清除stdin缓冲区以使用户输入的值不再在内存中可用?

我已经尝试过的信息:fflush,__ fpurge,fwrite(从stdin流的起始位置开始)......似乎没什么用。

提前谢谢。

4 个答案:

答案 0 :(得分:3)

我的回答是:不使用支持I / O流 - 改为使用原始文件I / O:

read(STDIN_FILENO, ...)

你必须自己进行行缓冲,但你可以保证库中没有任何东西可以保留你输入的缓冲区。

答案 1 :(得分:1)

你检查过这个吗? How do I flush the cin buffer?

尝试:

cin.clear();

答案 2 :(得分:0)

由于您正在使用C ++,为什么不直接使用std :: string类并直接使用cin>>password。这样就不需要单独的变量来保存每个字符的类型。如果在此之后,您仍然担心stdin的内容可用,请使用:

fseek(stdin,0,SEEK_END);

在阅读结束时。在我看来,这比编写旧的(在我看来,安全性较低)C方法更容易使用,并允许您更好地使用C ++库。

编码C ++时的一般经验法则:除非你绝对必须使用C,否则不要使用C.

答案 3 :(得分:0)

我完全不了解C ++,但我在C中做的是DoxyLover建议的,或者,如果你想坚持使用标准库...使用它而不缓冲,谷歌搜索“c ++ cin unbuffered”毕竟确实给出了一些结果