为什么我的c++程序要打印一个额外的换行符?
Why does my C++ program print an extra newline?
好吧,我已经花了好几个小时了....
//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++标准中没有字符输入的规定,在不同的系统中,做这件事的技术也有很大的不同
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 在 Stream C++ 文本之前有一个额外的换行符
- 流:CSV 文件中的换行符
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- Clang-格式:在多行语句之后的换行符上打开大括号
- 一次读取一个字符的文件,直到使用 read(2) 和 write(2) 换行符
- 如果在循环中给cin一个意外的输入,则会自动输入C++换行符作为输入
- 编写一个简单的函数,其工作方式与"std::cout"类似,但在末尾添加换行符
- 编写一个C++ pgm 以从文件"input.txt"读取,每当遇到句点时插入换行符并将修改的内容写入"output.txt"
- 你能定制一个输入的换行符(C++)吗
- 当使用字符串流解析字符串时,它会提取一个换行符
- 在 std::string 中每设置一个字母量添加一个换行符
- 当子字符串只是一个换行符时,string.find(substring) 函数返回什么
- 为什么Qt Creator在cout.flush()调用后添加一个换行符
- c++如何在CURLOPT_中写入一个换行符
- QPushButton工具提示插入一个换行符而不需要我指定它
- 是否可以创建一个宏,将换行符替换为分号
- QFile 忽略最后一个换行符
- 为什么我的c++程序要打印一个额外的换行符?