在检查时感到困惑

Rav*_*nJe 3 c++ string iostream input cin

我对这段代码感到困惑:

#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;
}
Run Code Online (Sandbox Code Playgroud)

这很容易,但是当我调试它时,例如我不写任何东西,只需按Enter键,它什么都不做.只是不断向我显示一条闪烁的下划线,如果我一直按Enter键,它就会逐行跳转.为什么程序没有读取条件?我想要的是,如果用户没有写任何东西,while开始的条件!

Rei*_*ica 6

您正在使用流提取器,>>这是一种格式化的输入函数.对于许多类型(例如基本类型和std::string),它们首先跳过当前流(1)中的所有空格,然后提取字符,只要它们是您要提取的数据类型的有效表示即可.

换句话说,当您只按Enter标准输入时,流中只会出现换行符.换行符是空格,因此该>>函数仍然卡在其"跳过启动空白"模式中.只有当您输入非空白字符时,第二部分("提取字符并尝试将其解释为提取类型的表示")才会启动.

如果要始终按行读取,可以使用getline流函数或std::getline函数.您还可以将这些与istringstream对象组合以解析该行.


(1)此行为可通过流操纵来控制skipwsnoskipws,或直接由流的格式化标志.