Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的C++;程序打印额外的换行符?_C++ - Fatal编程技术网

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' ) ...