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

Why is my console application not waiting for lines 37 and 38?

本文关键字:等待 我的 控制台 应用程序 为什么      更新时间:2023-10-16

请帮助解决此问题。当我运行可执行文件时,控制台没有给我时间按照第 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 NPSn";
    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;
}

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

operator>>遇到无法转换的字符时停止读取输入。该字符(例如按 Enter空格键时)将保留在流的缓冲区中,并立即可供第 37 行的operator>>读取,而无需提示用户输入更多内容。

因此,例如,如果您输入47并按 Enter 作为最后一个double值,则值47被解析为double变量,而 Enter 键将被 std::cin >> ans 读取为n字符。

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

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