需要额外的换行符
Extra newline character needed
#include <iostream>
using namespace std;
int main()
{
int a;
do
{
/* First reset the flag and then clean the buffer*/
cin.ignore();
cin.clear();
/* Input the number from the user*/
cout << "Enter numbern";
cin >> a;
/*Diplay appropiate error if the input was wrong*/
if(cin.fail())
{
cout << "invalid input n";
}
/*Display the number if the input was valid*/
else
{
cout << "number entered is : " << a << endl;
}
}
while(cin.fail()); //repeat until the input is correct
return 0;
}
每次执行此程序时,我都必须先输入一个新行,然后执行cout<<"Enter numbern";
。
它背后的原因是什么,可能的解决方案是什么。
注意:如果没有cin.ignore()
程序将进入无限循环
cin.ignore();
cin.clear();
/* Input the number from the user*/
cout << "Enter numbern";
cin >> a;
自
/* Input the number from the user*/
cout << "Enter numbern";
cin.clear();
cin.ignore();
cin >> a;
编辑了以下评论:
cin.ignore()
期待一些输入,只是忽略它。您应该在 if
语句中移动此行,然后cout << "invalid input n";
。
你正在做的事情有几个问题。 第一个正如贝努瓦所说:你给cin.ignore()
打电话太早了,在输出提示之前。 cin.ignore()
将提取正好是输入流中的一个字符(除非输入流失败,或遇到文件末尾(。
第二个是当你循环时(比如说因为用户有输入"abc"
(,cin.ignore()
您在重置错误,所以这是一个无操作。 如果用户输入的任何内容,但一个数字,你会永远循环,因为你会被困在错误的输入。 您可能应该将cin.clear()
放在处理错误的if
的分支。 (当然,这个意味着您需要某种标志来测试 do...while
,因为错误将在时间之前清除你到了那里。 或者,您可以将clear
和 ignore
在循环的顶部,但在if
,所以你只做他们如果cin.fail()
。
第三是你只忽略了一个字符。 如果用户输入"abc"
,这将循环四次("abc"
加上新的行(之前等待他的输入。 通常的解决方案是忽略下一个换行符:
cin.ignore( std::numeric_limits<std::streamsize>::max(), 'n' );
这应该在您输入int
后完成(可能不管你是否失败,但因为你不失败就会退出失败了,那你不做也没关系(。
最后,关于风格的两点:无处不在的互动方式无论输入是否成功,都将流视为一个布尔值:
if ( !cin ) {
// error...
} else {
// OK...
}
// ...
} while ( !cin );
我并不是说这是好的做法(在很多方面,我更喜欢你的风格(,但它是如此普遍,以至于其他任何事情都会导致代码的读取器开始,并询问您为什么这样做不同的东西。
我会用提示将输入分成一个单独的函数,并写下类似以下内容:
template <typename T>
std::istream&
inputWithPrompt( std::istream& source, std::string const& prompt, T& dest )
{
std::cout << prompt;
source >> dest;
return source;
}
int
main()
{
int a;
while ( !inputWithPrompt( std::cin, "Enter a number:", a ) ) {
std::cin.clear();
std::cin.ignore( std::numeric_limits<std::streamsize>::max, 'n' );
std::cout << "Invalid input" << std::endl;
}
std::cout << "Number entered is: " << a << std::endl;
return 0;
}
这对我来说似乎要干净得多:循环直到你成功,然后做离开循环后的成功输出。 (可能是值得将清理代码、clear
和ignore
放入也是一个单独的函数。 如果您使用 >>
进行输入,你会经常需要它。
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 在 Stream C++ 文本之前有一个额外的换行符
- 流:CSV 文件中的换行符
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- Clang-格式:在多行语句之后的换行符上打开大括号
- 在输出流中插入换行符
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- QProcess::readAllStandardOutput() 和换行符
- 如果有换行符,clang 格式不会附加大括号
- 提取后返回换行符的C++istream.get()
- 如何在出现换行符之前将多个整数作为输入?
- 正则表达式 获取两个换行符之间的文本
- 包含换行符分隔的单词的文件和C++中这些单词的字符串向量的大小是否相同?
- 在字符串中输入换行符
- 从文本文件中读取数据并删除所有换行符空格,并在 C++ 控制台中显示
- 使用 fgets() 从键盘读取时从以前的输入读取换行符
- C++ 换行符上的合并排序错误中断
- 在 std::string 的末尾插入换行符
- 连接两个文件时如何避免冗余尾随换行符?