我该如何处理从cin读取的超出字符?

4
在下面的代码中,如果我在运行时输入超过30个字符,它将根本不会读取linesNum1text[]。所以我认为它会将array1[30]中的额外字符存储起来,并在linesNum1中使用它。那么我该如何清除程序的缓存,或使它即使我输入的字符数超过array1的容量也可以读取linesNum1text[]
char array1[30];
for (int i = 0; i<30; i++)
    cin >> array1[i];
int linesNum1;
cin >> linesNum1;
int linesNum2 = linesNum1*80;

char text[linesNum2];
for (int i = 0; i < linesNum2; i++)
    cin >> text[i];

for (int i = 0; i < linesNum2; i++)
    cout << text[i];

你提出了一个非常好的问题,人们不太可能会给你点踩。 - IanPudney
这个问题的答案提供了一些建议,可以避免输入缓冲区溢出:http://stackoverflow.com/questions/4895216/testing-buffer-overrun-of-input - Kristopher Johnson
2个回答

2

我相信你需要的是 std::cin.ignore(INT_MAX);

这将读取并忽略直到EOF的所有内容。此外,在此之前,您很可能还需要执行std::cin.clear();以重置流。

编辑: 除了cin.ignore()之外,还有可选的第二个参数:

std::cin.ignore(INT_MAX,'\n');

这将忽略直到行末的内容。


1

为了摆脱可能存在的额外字符,您需要刷新 stdin 缓冲区。

您可以使用 istream::ignore 来丢弃流中所有可用的字符:

//Will discard everything until it reaches EOF.
cin.ignore(numeric_limits<streamsize>::max());

//Will discard everything until it reaches a new line.
cin.ignore(numeric_limits<streamsize>::max(), '\n');

例子:

/* read 30 chars */
for (int i = 0; i<30; i++) cin >> array1[i];
/* discard all extra chars on the line */
cin.ignore(numeric_limits<streamsize>::max(), '\n');
/* clear the stream state flags */
cin.clear();
cin >> linesNum1;
...

我在程序头部使用了 using namespace std;,你能否解释一下这个答案的含义? - Akram Lazkanee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接