为什么我的控制台应用程序不等待第37和38行?

时间:2016-07-12 01:43:57

标签: c++

此问题需要帮助。当我运行可执行文件时,控制台没有给我时间按照第37行的要求输入字符,而且我无法识别问题。它仅在我注释掉两个for循环时才有效。代码如下所示:

#include "../../std_lib_facilities.h"
#include "../../Eigen/Eigen"
#include "../../Eigen/Dense"
#include <Windows.h>
#include <time.h>

using namespace Eigen;

int main()
{
    SetConsoleTitle(TEXT("PipeThk_v1.0"));
    system("CLS");
    system("color F1");
    time_t rawtime_start;
    struct tm * timeinfo_start;
    time(&rawtime_start);
    timeinfo_start = localtime(&rawtime_start);
    printf(asctime(timeinfo_start));

    cout << "\nEnter nominal pipe sizes in 'in':\n";
    vector<double> npss;
    for (double nps; cin >> nps;)
    npss.push_back(nps);

    cout << "\n NPS\n";
    for (const auto& i : npss)
    cout << "\n " << i;

    time_t rawtime_end;
    struct tm * timeinfo_end;
    time(&rawtime_end);
    timeinfo_end = localtime(&rawtime_end);
    cout << endl << endl << asctime(timeinfo_end);

    cout << "\nEnter any character and hit enter to exit:\n";
    char ans;
    cin >> ans;

    return 0;
}

1 个答案:

答案 0 :(得分:3)

您正在使用operator>>std::cin解析为double变量。

operator>>在遇到无法转换的字符时停止读取输入。该字符,例如当按下 Enter Space 时,将保留在流的缓冲区中,并立即可由operator>>在线读取37,无需提示用户提供更多输入。

因此,例如,如果您输入47并按输入作为最后一个double值,则值47会被解析为{{1}变量, Enter 键被double读取为\n个字符。

今天的教训是:不要使用std::cin >> ans来处理来自终端的operator>>的交互式输入。使用std::cin一次读取一行文本,然后根据需要构造一个std::getline()对象来解析该行。将std::istringstream的每次出现替换为std::cin >> ...,以避免在解析交互式输入时出现意外的意外。

当然,这不是唯一的方法,而是需要最少量工作的方法,并且会产生最少量的意外行为。