我对这段代码感到困惑:
#include "stdafx.h"
#include "std_lib_facilities.h"
int main()
{
string name_one;
string name_two;
string name_three;
cout << "Please enter a name: ";
cin >> name_one;
cout << "\nReading data...";
while (name_one.empty())
{
cout << "\nFailed!";
cout << "Please enter a name: ";
cin >> name_one;
cout << "\nReading data...";
}
cout << "Completed!\n";
keep_window_open();
return 0;
}
这很容易,但是当我调试它时,例如我不写任何东西,只需按Enter键,它什么都不做。只是不断向我显示一条闪烁的下划线,如果我一直按Enter键,它就会逐行跳转。为什么程序没有读取条件?我想要的是,如果用户没有写任何内容,while
中的条件就会开始!
答案 0 :(得分:6)
您正在使用流提取程序>>
,它是格式化的输入函数。对于许多类型(例如基本类型和std::string
),这些首先跳过当前流(1)中的所有空格,然后提取字符,只要这些字符是您要提取的数据类型的有效表示。
换句话说,当您在标准输入上按 Enter 时,流中只会出现换行符。换行符是空格,因此>>
函数仍然卡在其内部&#34;跳过开始空格&#34;模式。只有当您输入非空白字符时,第二部分(&#34;提取字符并尝试将其解释为提取类型的表示&#34;)才会启动。
如果您想要始终按行阅读,可以使用getline
流功能或std::getline
功能。您还可以将这些与istringstream
对象组合以解析该行。
(1)此行为可以由流操纵器skipws
and noskipws
控制,也可以直接由流formatting flags控制。