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

Why does my C++ program print an extra newline?

本文关键字:一个 换行符 c++ 我的 程序 打印 为什么      更新时间:2023-10-16

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

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

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

当您输入数据时,您键入字母然后按 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';
}

只要将cin.get(letter)更改为cin >> letter;,它就会像预期的那样工作。

编辑:我想我给出了更多的信息。Get()只从流中提取一个字符,这将留下换行符,正如其他人指出的那样。下一次调用get()将提取它并立即终止,而不是等待输入,因为流仍然有数据。另一方面,>> -操作符正是为您在这里要做的事情而设计的:从stdin中读取一个值,直到按下返回键。因此,它也消耗换行符,导致对operator<<()的下一次调用阻塞,直到用户输入新数据。

注意:还有一件事要记住:>> - extraction into a char将从流中最多提取一个字符,但它并不阻止用户在按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>>()呼叫。

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

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

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

还要注意,在大多数系统上,cin.get()将不会返回,直到你按下回车键(假设是从键盘输入)。所以你会输出"Enter a letter: ",然后等待,直到回车键被按下。然后循环不用等待,读取所有的你输入的字符,直到你读到'n'。在那里c++标准中没有字符输入的规定,在不同的系统中,做这件事的技术也有很大的不同