C++ 为什么我的C++;程序打印额外的换行符?
好的,我已经做了好几个小时了C++ 为什么我的C++;程序打印额外的换行符?,c++,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 <&
//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: k
K
Enter a letter: a
A
你能帮我解释一下为什么要这样做吗?当你输入数据时,先键入字母,然后按enter键。这会将您的字母以及返回字符(
\n
)添加到流中。由于cin.get()
不会在流中还有字符要提取时等待您的输入,因此它每隔一次就会提取一次\n
您可以通过添加cin来快速修复此问题。忽略:
while (letter != '1')
{
cout << "Enter a letter: ";
cin.get(letter);
cin.ignore(256, '\n');
cout << char(toupper(letter)) << '\n';
}
只需将cin.get(letter)
更改为cin>>letter代码>,它将按预期工作
编辑:我想我会提供更多的信息。get()只从流中提取一个字符,这会像其他人指出的那样将换行符留在其中。对get()的下一个调用将提取它并立即终止,而不是等待输入,因为流仍然有数据。另一方面,>
-运算符完全是为您在此处尝试执行的操作而设计的:从stdin读取一个值,直到按下返回键。因此,它也会使用换行符,导致下一次调用操作符
——提取到字符将最多从流中提取一个字符,但这不会阻止用户在按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
这是因为运算符删除了一个字符和换行符,但保留了流中剩余的字符。这将立即终止接下来的三个操作员>>()
-呼叫。对于初学者,因为您没有检查cin.get
是否成功
或者不是。您几乎肯定会输出最后一个字符
读两遍。您的循环应该是:
while ( letter != '1' && cin.get( letter ) ) ...
或
还要注意的是,在大多数系统上,cin.get()
直到
您点击回车键(假设从键盘输入)。所以你会
输出“输入一个字母:
,然后等待回车键
压力很大。然后,您将不等待地循环,阅读所有
您输入的字符,直到您阅读了'\n'
。那里
在C++标准中没有字符输入的规定,
而且,不同的系统实现这一点的技术有很大的不同
到下一个。首先尝试使用why cin.get而不是cin>>?第一个字母是您键入的,第二个字母是您的程序打印出来的。不是吗???如果要使输入“不可见”,您可能需要使用类似这样的包。不,我相信发生的情况是您正在发送H和\n,并且它会在您正确的第二次打印。我已经更新了文章标题,使其更有意义。使用提取操作符cin>
也有同样的效果。建议的解决方案仍然不正确。任何使用cin.get(letter)
结果而未首先检查是否成功的操作都是不正确的。:D耶,谢谢!只是一个后续问题……256代表什么?256是streamsize
参数cin.ignore
从输入序列中提取字符并丢弃它们。当streamsize
字符被提取并丢弃,或者在找到字符delim
时(以先到者为准),提取结束。是否使用cin.get(letter)
或cin>>letter
与问题无关。问题是1)他使用结果时没有测试输入是否实际成功,2)他没有采取任何步骤关闭操作系统的常规行处理。
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
while ( letter != '1' && cin.get( letter ) ) ...
while ( cin.get( letter ) && letter != '1' ) ...