以下是运行程序时输入缓冲区发生的情况:
std::cin >> name;
您正在等待输入。当您输入“Ryan Cleary”并按 Enter 键时,输入缓冲区包含:
Ryan Cleary\n
现在你的cin
正常读取输入,在空白处停止,让缓冲区像这样:
Cleary\n
注意开头的空格,因为读完后就停止了Ryan
。您的第一个变量现在包含Ryan
。但是,如果您想要全名,请使用std::getline http://en.cppreference.com/w/cpp/string/basic_string/getline。它将读取到换行符,而不仅仅是空格。无论如何,继续:
std::cin >> age;
现在你得到了另一个输入。不过那里已经有东西了。它会跳过空白直到可以开始读取,只留下缓冲区:
\n
你的第二个变量获取文本Cleary
。请注意,换行符仍在缓冲区中,这将我带到第二部分。更换system ("pause");
以一种始终有效的方式是很棘手的。你最好的选择通常是接受一个不太完美的解决方案,或者像我喜欢做的那样,一个不能保证完全按照它所说的去做的解决方案:
std::cin.get(); //this consumes the left over newline and exits without waiting
可以,然后呢cin.get() http://en.cppreference.com/w/cpp/io/basic_istream/get没用。这个怎么样:
std::cin.get(); //consume left over newline
std::cin.get(); //wait
这工作得很好,但是如果你将它复制粘贴到没有留下换行符的地方怎么办?您必须按两次 Enter 键!
解决方案是清除换行符(以及其他任何内容),然后等待。这就是目的cin.sync() http://en.cppreference.com/w/cpp/io/basic_istream/sync。但是,如注释部分所示,不能保证像它所说的那样清除缓冲区,因此如果您的编译器选择不这样做,则无法使用它。然而,对我来说,它确实做到了这一点,留下了一个解决方案:
std::cin.sync(); //clear buffer
std::cin.get(); //wait
主要的坏处是system("pause");
是你不知道它会在别人的计算机上运行什么程序。他们本可以改变pause.exe
或者把找到的放在第一位,而你却无从得知。这可能会损坏他们的计算机,因为它可能any程序。