在我的情况下,我的应用程序的用户被要求输入他们的密码来启动它。要获得密码,我只需使用:
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"确实会在所有之后给出一些结果