3

好吧,我已经在这几个小时了....

//after a character is entered, library routines are used to uppercase the
letters. loops the program until "1" is entered

char letter;

while (letter != '1')
{
    cout << "Enter a letter: ";
    cin.get(letter);
    cout << char(toupper(letter)) << '\n';
}

一切正常,但它会“输入一个字母:”两次......

这是一个示例输出

Enter a letter: h
H
Enter a letter: 

Enter a letter: k
K
Enter a letter: 

Enter a letter: a
A

我希望它看起来像这样

Enter a letter: h
H
Enter a letter: k
K
Enter a letter: a
A

你能帮忙解释一下为什么会这样吗......

4

3 回答 3

8

输入数据时,键入字母,然后按ENTER。这会将您的字母以及返回字符 ( \n) 添加到流中。由于cin.get()当仍有字符要从流中提取时不会等待您的输入,所以它会\n每隔一次传递。

您可以通过添加以下内容快速解决此问题cin.ignore

while (letter != '1')
{
    cout << "Enter a letter: ";
    cin.get(letter);
    cin.ignore(256, '\n');
    cout << char(toupper(letter)) << '\n';
}

一种替代方法是使用>>运算符,因为cin.get一次只检索一个字符:

while (letter != '1')
{
    cout << "Enter a letter: ";
    cin >> letter;
    cout << char(toupper(letter)) << '\n';
}
于 2013-01-09T23:52:17.333 回答
3

只需将 更改cin.get(letter)cin >> letter;,它就会按预期工作。

编辑:以为我会提供更多有关此的信息。get() 从流中准确提取一个字符,正如其他人指出的那样,这将把换行符留在其中。对 get() 的下一次调用将提取它并立即终止,而不是等待输入,因为流仍然有数据。>>另一方面, -operator 正是为您在此处尝试执行的操作而制作的:从 stdin 读取一个值,直到按下返回键。所以它也消耗换行符,导致下一次调用operator<<()阻塞,直到用户输入新数据。

注意:还有一件事要记住:->>提取到一个字符将最多从流中提取一个字符,但它不会阻止用户在按 Enter 之前输入更多字符。这将产生一些输出,如下所示:

niko@lethal-guitar:~$ ./a.out 
Enter a letter: a
A
Enter a letter: asas
A
Enter a letter: S
Enter a letter: A
Enter a letter: S

这是因为操作员删除了一个字符和换行符,但将剩余的字符保留在流中。这些将立即终止接下来的三个operator>>()调用。

于 2013-01-09T23:53:00.737 回答
1

对于初学者,因为您不检查是否cin.get成功。你几乎肯定会输出你读过两次的最后一个字符。你的循环应该是:

while ( letter != '1' && cin.get( letter ) ) ...

或者

while ( cin.get( letter ) && letter != '1' ) ...

还要注意,在大多数系统上,cin.get()在您按 Enter 之前不会返回(假设从键盘输入)。所以你会输出"Enter a letter: ",然后等到按下回车键。然后,您无需等待即可循环,读取您输入的所有字符,直到您读取'\n'. C++ 标准中没有按字符输入的规定,而且执行此操作的技术因系统而异。

于 2013-01-10T00:20:28.290 回答