使用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
非常感谢任何帮助,谢谢。
答案 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);