Getline(CIN,字符串)不给出预期的输出



使用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忽略(下面如何实现),它将从输入字符串中删除某些字符,并使用错误的变量存储它们。请注意,我的字符串与空格。

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

我也试图冲洗代表,没有帮助。

我的打印功能就像魅力一样,如果我从Main手动添加课程,我将获得预期的输出,因此问题绝对是CIN/Getline。

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

我在此处说明:http://www.cplusplus.com/reference/string/string/string/getline/?kw=getLine

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

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

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

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

最新更新