为什么我的C ++程序会打印一个额外的换行符?

时间:2013-01-09 23:48:23

标签: c++

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

//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

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

3 个答案:

答案 0 :(得分: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';
}

答案 1 :(得分:3)

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

编辑:我想提供更多相关信息。 get()从流中提取一个字符,这会将换行符留在其中,就像其他人指出的那样。下一次调用get()将提取它并立即终止而不是等待输入,因为流仍然有数据。另一方面,>> - 运算符完全取决于您在此处尝试执行的操作:从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

这是因为运算符删除了一个char和换行符,但保留了流中剩余的字符。这些将立即终止接下来的三个operator>>() - 来电。

答案 2 :(得分:1)

对于初学者,因为你不检查cin.get是否成功 或不。你几乎肯定会输出你的最后一个角色 读了两遍。你的循环应该是:

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

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

另请注意,在大多数系统上,cin.get()将不会返回 你点击输入(假设从键盘输入)。所以你会 输出"Enter a letter: ",然后等到输入键 被压了。然后你将循环而不等待,阅读全部 您输入的字符,直到您阅读'\n'为止。那里 在C ++标准中没有字符输入的规定, 从一个系统来看,这样做的技术有很大的不同 到下一个。