C++ getline()即使在clear()之后也会先跳过
所以我有一个函数,它不断跳过第一个getline,直接跳到第二个getline。我试图清除缓冲区,但仍然没有运气,发生了什么事C++ getline()即使在clear()之后也会先跳过,c++,arrays,char,buffer,getline,C++,Arrays,Char,Buffer,Getline,所以我有一个函数,它不断跳过第一个getline,直接跳到第二个getline。我试图清除缓冲区,但仍然没有运气,发生了什么事 void getData(char* strA, char* strB) { cout << "Enter String 1: "; // Shows this line cin.clear(); cin.getline(strA, 50); // 50 is the
void getData(char* strA, char* strB)
{
cout << "Enter String 1: "; // Shows this line
cin.clear();
cin.getline(strA, 50); // 50 is the character limit, Skipping Input
cout << endl << "Enter String 2: "; // Showing This Line
cin.clear();
cin.getline(strB, 50); // Jumps Straight to this line
}
void getData(char*strA,char*strB)
{
在调用函数之前,请确保没有使用cin>>str
。如果使用cin>>str
,然后想使用getline(cin,str)
,则必须在调用之前调用cin.ignore()
string str;
cin >> str;
cin.ignore(); // ignores \n that cin >> str has lefted (if user pressed enter key)
getline(cin, str);
如果使用c字符串:
char buff[50];
cin.get(buff, 50, ' ');
cin.ignore();
cin.getline(buff, 50);
ADD:您的错误可能不在函数本身,而是在调用函数之前。流cin
必须首先在cin.getline
中读取一个新行字符\n'
,在读取某些内容后,bufor中仍然有“RETURN”字符,因此您必须cin.ignore()
每次读取后
您还可以使用cin.sync()
清除流。
实际清除方法仅清除标志
还有一个选项是,您可以转到流的末尾,没有任何内容可以阅读,您应该毫无问题地编写
std::cin.seekg(0, std::ios::end);
您将使用什么取决于您。cin.clear();
清除流中的任何错误位-它不会消耗任何可能挂起的数据
您希望使用cin.ignore()
来使用流中的数据。使用cin.ignore(-1);
它不会删除输入字符串的第一个字符。在使用get行进行较大的输入后,cin会导致错误。因此,在getline之后使用此代码将返回输入队列并使位恢复正常
cin.getline(a,5);
while(getchar()!='\n');
cin.clear();
运行while循环以从队列中删除所有字符
cin.ignore()导致进一步输入和
cin.clear()只是重置错误位您的控制台宽度是否小于50个字符?我想默认值是80个字符