cin.get()得到太多

时间:2014-01-16 20:25:05

标签: c++ cin

我希望用户输入一个字符。我想过滤他们输入的内容,只选择他们输入的第一个字符。

int main(){
    while (true){
        char n = readOption();
        cout << n << std::endl;
    }
    return 0;
}


char readOption() {
    char input = '\0';
    while (input != '\n') {
        input = cin.get();
        if (isalpha(input)) {
            break;
        }
    }
    return toupper(input);
}

如果我输入13@ jkjoi,控制台就会打印出来。

J
K
J
O
I

我只想打印J。为什么还打印其他字母?

2 个答案:

答案 0 :(得分:2)

它正在打印所有字符,因为(在修复分号错误后),您将永远循环:

while (true)
{
    char n = readOption();
    cout << n << std::endl;
}

这将永远地反复调用您的读取功能!你的read函数循环直到他得到一个alpha字符,所以它忽略"13@ "然后为while (true)循环的每次迭代抓取1个字符。如果您希望在读取第一个字母字符后停止,请不要循环:

char n = readOption();
cout << n << std::endl;

<强>更新

根据您的评论,您实际上可以完全重写您的代码:

std::locale loc;
char c = '\0';
do
{
    // get a character with error checking
    while (!(std::cin >> c))
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
} while (!std::isalpha(c, loc));
// ignore the rest of the input
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

答案 1 :(得分:2)

因为你问过它。

你永远在循环中执行此操作。

如果你只想做一次,那就干一下吧。删除你的循环。