getline() 即使在 clear() 之后也会先跳过
Posted
技术标签:
【中文标题】getline() 即使在 clear() 之后也会先跳过【英文标题】:getline() skipping first even after clear() 【发布时间】:2012-08-24 13:45:05 【问题描述】:所以我有一个函数可以不断跳过第一个 getline 并直接跳到第二个 getline。我试图清除缓冲区但仍然没有运气,这是怎么回事?
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
【问题讨论】:
您的控制台是否小于 50 个字符宽?我认为默认是 80 【参考方案1】:确保您没有使用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);
添加:你的错误可能不在函数本身,而是在调用函数之前。流cin
必须在第一个cin.getline
中只读取一个换行符\n'
。
【讨论】:
【参考方案2】:cin.clear();
清除流上的所有错误位 - 它不消耗任何可能未决的数据。
您想使用cin.ignore()
来使用流中的数据。
【讨论】:
【参考方案3】:在你读完之后,bufor 里面还有 'RETURN' 字符,所以你必须在每次读完之后cin.ignore()
。
您也可以使用cin.sync()
清除流。
实际上 clear 方法只清除标志。
还有一个选项,你可以去到流的末尾,没有什么要读的,你应该写没有问题。
std::cin.seekg(0, std::ios::end);
由你决定使用什么。
【讨论】:
【参考方案4】:使用cin.ignore(-1);
它不会删除输入字符串的第一个字符
【讨论】:
【参考方案5】:在使用 get 行进行较大输入后,cin 会导致错误。所以在getline之后使用这段代码返回输入队列和下降位正常。
cin.getline(a,5);
while(getchar()!='\n');
cin.clear();
运行一个while循环以从队列中删除所有字符 cin.ignore() 导致进一步输入的问题和 cin.clear() 只是为了重置fallbit
【讨论】:
以上是关于getline() 即使在 clear() 之后也会先跳过的主要内容,如果未能解决你的问题,请参考以下文章
即使我使用字符串空格,也使用 >> 和 getline 获取空输出
cin 详解(get()getline()clear()sync())
在 getline(cin, string) 之后使用 cin