需要额外的换行符

Extra newline character needed

本文关键字:换行符      更新时间:2023-10-16
#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,因为错误将在时间之前清除你到了那里。 或者,您可以将clearignore在循环的顶部,但在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;
}

这对我来说似乎要干净得多:循环直到你成功,然后做离开循环后的成功输出。 (可能是值得将清理代码、clearignore放入也是一个单独的函数。 如果您使用 >> 进行输入,你会经常需要它。