【问题标题】:Input not cleared输入未清除
【发布时间】:2011-02-12 01:58:01
【问题描述】:

正如问题所说,由于某种原因,我的程序没有以我目前无法识别的方式刷新输入或使用我的变量。这是一个家庭作业项目,我已经超出了我必须为此做的事情,现在我只想让程序真正工作:P

使查找更容易的详细信息:

程序在第一次运行时完美执行。所有的抛出都有效,只有正确的值( n > 0 )被接受并变成二进制。

一旦我输入终止输入,程序就会进入一个循环,并且只要求再次终止,如下所示:

当我在我的 Linux 笔记本电脑上的 Netbeans 上运行此程序时,在我输入终止值后程序崩溃。在 Windows 上的 Visual C++ 上,它会像刚才描述的那样进入循环。

在代码中,我尝试在程序重新启动时清除每个流并初始化每个新变量,但无济于事。我只是看不到我的错误。

我认为错误在于主要功能:

int main( void )
{
vector<int> store;
int terminate = 1;

do
{
    int    num   =  0;
    string input = "";

    if( cin.fail() )
    {
        cin.clear();
        cin.ignore( numeric_limits<streamsize>::max(), '\n' );
    }

    cout << "Please enter a natural number." << endl;
    readLine( input, num );

    cout << "\nThank you. Number is being processed..." << endl;
    workNum( num, store );

    line;
    cout << "Go again? 0 to terminate." << endl;
    cin >> terminate // No checking yet, just want it to work!

    cin.clear();
}while( terminate );

cin.get();
return 0;
}

或在读取数字的函数中:

void readLine( string &input, int &num )
{
    int buf = 1;
    stringstream ss;
    vec_sz size;

    if( ss.fail() )
 {
        ss.clear();
     ss.ignore( numeric_limits<streamsize>::max(), '\n' );
 }

    if( getline( cin, input ) )
    {
       size = input.size();
       for( int loop = 0; loop < size; ++loop )
           if( isalpha( input[loop] ) )
               throw domain_error( "Invalid Input." );

    ss << input;
    ss >> buf;

    if( buf <= 0 )
        throw domain_error( "Invalid Input." );

    num = buf;

    ss.clear();
    }
}

【问题讨论】:

    标签: c++ input flush


    【解决方案1】:

    不要像 interjay 提到的那样混合使用 &gt;&gt;getline 运算符。 另外,如果您想清除代码,我认为可以按照以下方式重写:

    int main() {
       while (true) {
          std::cout << "Please enter a natural number" << std::endl;
          int num;
          std::cin >> num;
    
          // Exception handling here can be done easily
          // like this
          // if (!(std::cin >> num) || num < 0)
          //    throw std::domain_error("TROLOLOLO");
    
          std::cout << "Thank you. Number is being processed..." << std::endl;
          //workNum(num, store) here
    
          std::cout << "Go again? 0 to terminate." << std::endl;
    
          int terminate;
          std::cin >> terminate;
          if (terminate == 0) break;
       }
    }
    

    【讨论】:

      【解决方案2】:

      当您调用cin &gt;&gt; terminate 时,它将读取terminate 的值,但在输入流中将换行符留在它后面。当你调用getline(cin, input) 时,它会读取到换行符,这意味着它会得到一个空字符串。

      您可以通过在cin &gt;&gt; terminate 之后添加以下内容来丢弃换行之前的所有字符:

      cin.ignore(99, '\n');
      

      或者避免混淆operator &gt;&gt;getline

      【讨论】:

      • 啊啊啊,我以为 if(cin.fail()) 会清除流,但是是的,这是一个逻辑错误 ^^ 谢谢!
      猜你喜欢
      • 2021-08-16
      • 1970-01-01
      • 2013-05-30
      • 2020-05-17
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多