1

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

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

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

但就我而言,我仍然可以检索密码值,因为它似乎仍在标准输入缓冲区中。

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

对于我已经尝试过的信息:fflush、__fpurge、fwrite(从标准输入流的开始位置)......似乎没有任何效果。

先感谢您。

4

4 回答 4

3

我的回答是:不要使用标准 I/O 流——改用原始文件 I/O:

read(STDIN_FILENO, ...)

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

于 2013-07-30T18:32:58.477 回答
1

你检查过这个吗?如何刷新 cin 缓冲区?

尝试:

cin.clear();
于 2013-07-30T18:58:19.330 回答
0

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

fseek(stdin,0,SEEK_END);

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

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

于 2013-07-30T19:27:02.453 回答
0

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

于 2013-07-30T20:02:08.613 回答