【问题标题】:Confused about while check在检查时感到困惑
【发布时间】:2016-02-10 02:38:45
【问题描述】:

我对这段代码感到困惑:

#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 中的条件就开始了!

【问题讨论】:

    标签: c++ string input iostream cin


    【解决方案1】:

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

    换句话说,当您在标准输入上按 Enter 时,流中只会有一个换行符。换行符是空格,因此&gt;&gt; 函数仍停留在其“跳过起始空格”模式中。只有当您输入非空白字符时,第二部分(“提取字符并尝试将它们解释为提取类型的表示”)才会启动。

    如果您想始终按行读取,可以使用getline 流函数或std::getline 函数。您还可以将这些与 istringstream 对象结合起来以解析行。


    (1) 此行为可以由流操纵器skipws and noskipws 控制,或直接由流的formatting flags 控制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      相关资源
      最近更新 更多