【问题标题】:getline(cin, string) not giving expected outputgetline(cin, string) 没有给出预期的输出
【发布时间】:2018-02-22 14:03:55
【问题描述】:

使用 c++14。我已经阅读了很多关于这个问题的帖子。

如果我在下面运行此代码,它会跳过 getline 行。

#include <iostream>
#include "main_menu.h"

void MainMenu::AddTest()
{
    std::string courseName = "";
    std::string testName = "";
    std::string date = "";

    std::cout << "Enter course name: " << std::endl;
    std::getline(std::cin, courseName);

    std::cout << "Enter test name: " << std::endl;
    std::getline(std::cin, testName);

    std::cout << "Enter test date: " << std::endl;
    std::getline(std::cin, date);

    Test test(courseName, testName, date);
    tests.Add(test);

    std::cout << "Test registered : " << std::endl;
    tests.Print(test.id);
}

如果我在每个 getline 行之后添加 cin ignore(下面是我如何实现它的示例),它会从输入字符串中删除一些字符并使用错误的变量来存储它们。请注意,我有带空格的字符串。

std::getline(std::cin, courseName); 
std::cin.ignore();

这是我得到的:

Enter course name: 
History 2
Enter test name:     
History 2 exam
Enter test date: 
2017.01.02
Test registered : 
test id = 2, course name = , test name = istory 2, date = istory 2 exam

我也试过冲洗 cout,没有帮助。

我的打印功能就像一个魅力,如果我从 main 手动添加课程,我会得到预期的输出,所以问题肯定是 cin / getline。

Test registered : 
test id = 1, course name = History 2, test name = History 2 exam , date = 01.02.2017

我使用 getline,如下所述:http://www.cplusplus.com/reference/string/string/getline/?kw=getline

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: cin getline


    【解决方案1】:

    通过使用cin.ignore,您正在搞乱输入本身。如果您想摆脱 \n 字符,您不必这样做! getline 会自动执行此操作。所以不要使用ignore 函数,代码就可以了。 这有效:

    #include<iostream>
    
    using namespace std;
    
    int main()
    {
       string courseName = "";
       string testName = "";
       string date = "";
    
       cout << "Enter course name: " << std::endl;
       getline(std::cin, courseName);
    
       cout << "Enter test name: " << std::endl;
       getline(std::cin, testName);
    
       cout << "Enter test date: " << std::endl;
       getline(std::cin, date);
    
       cout << courseName << endl;
       cout << testName << endl;
       cout << date << endl;
       return 0;
    }
    

    【讨论】:

    • 如果我不使用 cin.ignore,我永远无法输入 cin 本身。程序继续到下一个 cout,无需等待输入。它基本上列出了我的 cout,这是我最初的问题。 @Sinapse
    • cin.ignore 只会传递您输入的字符之一!你能测试一下上面的代码吗?你的编译器是什么?
    • 您的代码有效,我的无效。程序不会等待输入。请看一下我在顶部的原始代码(没有 cin.ignore 的代码),我看不出有什么不同。顺便说一句,我使用 GDB clion。
    • 你让我很困惑!如果这有效,你为什么不使用它!只是不要使用cin.ignore
    • 请从最上面阅读我的帖子,然后你就明白了。我没有使用 cin.ignore 开始。我意识到,这不起作用,程序不会等待输入,它会跳过我的 getline(cin, .....) 行并自动列出下一个 cout。所以我尝试通过实现cin.ignore来解决这个问题。它有帮助,程序现在停止并等待输入,但现在我所有的输入字符串都搞砸了。所以,1.如果我不使用cin.ignore,我就没有机会提供输入。 2.如果我使用它,它会与输入的文本混淆。希望现在很清楚,很抱歉造成混乱。
    【解决方案2】:

    我正在回答一个古老的问题,但请在使用所有 getline() 之前尝试清除输入流。在请求输入之前,缓冲区中可能有一些额外的返回值。

    cin.clear();
    cin.ignore(INT_MAX);
    

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2019-07-16
      相关资源
      最近更新 更多