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



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

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

一旦检查了密码,我就会销毁变量,这样就无法使用程序的核心映像来检索它。例如,如果有人使用"gcore"命令,然后在生成的核心中搜索密码,它将找不到

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

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

关于我已经尝试过的信息:fflush,__fpurge,fwrite(从stdin流的开始位置)。。。似乎什么都不起作用。

提前谢谢。

我的答案是:不要使用立式I/O流,而是使用原始文件I/O:

read(STDIN_FILENO, ...)

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

你检查过了吗?如何冲洗cin缓冲液?

尝试:

cin.clear();

既然使用C++,为什么不直接使用std::string类并使用cin>>password呢。这将消除在键入每个字符时需要单独的变量来保存每个字符的需要。如果在那之后,您仍然担心stdin的内容可用,请使用:

fseek(stdin,0,SEEK_END);

在阅读的最后。在我看来,这比编码旧的(在我看来是不太安全的)C方法更容易使用,并允许您更好地使用C++库。

编写C++时的一般经验法则:除非万不得已,否则不要使用C。

我对C++一无所知,但我在C中所做的要么是DoxyLover建议的,要么是,如果你想坚持使用标准库。。。在没有缓冲的情况下使用它,谷歌搜索"c++cinunbuffered"确实会在所有之后给出一些结果

最新更新