getline(cin,string)没有给出预期的输出

时间:2017-09-13 18:37:44

标签: cin getline

使用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

非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

使用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;
}

答案 1 :(得分:0)

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

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