我正在尝试多次读取单个字符 。问题是我需要防止用户错误。例如:
char arr[10];
for(int i = 0; i < 10; i++)
{
cin.get(arr[i]);
}
输入应该类似于a, b, c, d, ...
。但是,如果有人要为第一个条目输入ab
,我想要捕获a
,然后忽略b
。我知道cin.ignore
然而,我不知道如何忽略任意数量的字母数字字符或符号,因为我想忽略可能无限数量的字符然后再次忽略和读取。
如何忽略任意数量的字符,然后停止忽略或如何实际刷新cin的缓冲区。
答案 0 :(得分:1)
大多数输入都是换行符,因此如果您想要忽略输入流中的所有字符,直到您遇到换行符,那么您可以使用:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
由于我们忽略了streamsize
,因此输入缓冲区中不应该有额外的内容。
答案 1 :(得分:0)
如果您希望用户在每个符号后按Enter键,则代码可以像这样简单:
char arr[10];
for(int i = 0; i < 10; )
{
std::string line;
std::getline( std::cin, line );
// check that line is not empty
if( line.empty() ) {
std::cout << "missing input" << std::endl;
continue;
}
arr[i++] = line[0]; // get only first symbol and ignore the rest
}
如果您有其他想法,我担心这不适用于std::cin
- 在用户按下回车之前,您看不到任何输入。在这种情况下,您必须使用特定于操作系统的函数来获取无缓冲的输入。
答案 2 :(得分:0)
如果您输入的内容如下a 'enter' b 'enter' c 'enter' etc...
#include <iostream>
#include <string>
using namespace std;
int main() {
char arr[10];
string line;
for (int i = 0; i < 10; i++)
{
getline(cin, line);
arr[i] = line[0];
cout << endl << "Here is the Char: " << arr[i] << endl;
}
return 0;
}
但是如果您在一行中输入这样的输入:a,b,c,d,e,f,g,h,i,j 'enter'
,那么您需要以下代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
char arr[10];
string line;
int i = 0;
size_t end;
getline(cin, line);
end = 0;
int counter = 0;
if (line != "") {
while (end != string::npos && counter < 10) {
if (counter == 0) {
arr[counter] = line[0];
}
else {
end = line.find(",", end + 1);
arr[counter] = line[end + 1];
}
counter++;
}
}
for (int i = 0; i < 10; i++) {
cout << endl << "Here is the Char: " << arr[i] << endl;
}
return 0;
}