我使用getline(cin.getline()one)从cin获取字符串并查找特殊情况的问题 . 如果用户输入的字符数多于streamsize参数(在本例中为50),则cin缓冲区会保存它们并将它们放入下一个cin调用中 . 如果我使用cin.clear()和cin.ignore()并且用户输入的字符数少于streamsize参数,则程序会等待用户在继续之前再次按Enter键 . 所以我使用strlen来检查字符串的大小,如果字符串有50个字符,则只使用cin.clear()和cin.ignore() . 这会删除用户在第49个字符后输入的额外字符 . 问题是,当用户输入正好49个字符时,缓冲区中没有额外的字符可以通过cin.clear()和cin.ignore()调用来切断,因此程序将等待用户进入按另一次输入 .
几个问题:
1)是否有一个标志我可以检查缓冲区中是否有字符,所以只有当这个标志为真时我才能清除()和忽略()?
2)还有其他方法我可以调用同一个getline函数来切断streamsize参数后的所有字符吗?
这是我的代码:
#include <iostream>
#include <cstring>
using namespace std;
#define SIZE 50
void getString(char*);
int main() {
char words[SIZE];
getString(words);
return 0;
}
void getString(char* words) {
cout << "Enter your string: ";
cin.getline(words, SIZE);
if (strlen(words) == SIZE - 1) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
}
导致问题的示例49字符输入:
abcdefghijklmnopqrstuvwxysabcdefghijklmnopqrstuvw
删除或添加一个字母以查看该程序的正常性能 .
1 回答
您可以使用
istream::gcount()
来判断行中是否还有除'\n'
以外的其他字符 .以下是您需要考虑的案例 .
cin.gcount()
的返回值小于SIZE-1
. 在这种情况下,线上没有任何东西 . 您不必担心忽略其余部分 .cin.gcount()
的返回值为SIZE-1
. 这可能是由于两种情况 .用户输入
SIZE-2
个字符后跟换行符 . 在这种情况下,线上没有任何东西 . 您不必担心忽略其余部分 .用户输入
SIZE
或更多字符后跟换行符 . 在这种情况下,行中仍然有一些字符 . 您将要忽略该行的其余部分 .cin.gcount()
的返回值是SIZE
. 仅当用户输入SIZE-1
字符后跟换行符时才会发生这种情况 . 该行中的所有字符都被读入提供给该函数的参数中 . 读取并丢弃换行符 . 您不必担心忽略其余部分 .给出上述情况,只有当你遇到案例2.2时,你唯一需要担心忽略其余部分 .
cin.gcount() == SIZE-1
和strlen(words) == SIZE-1
符合条件 .