【问题标题】:cin.get() is non-blockingcin.get() 是非阻塞的
【发布时间】:2011-12-30 09:28:23
【问题描述】:

我遇到了与链接问题中提到的相同的问题。控制台窗口(在 VS 2010 中)在运行程序后立即消失。我使用 cin.get();在 main 函数结束时,但问题仍然存在。关于可能的原因有什么想法吗?您可以查看 main 中的代码:

int main()
{
    const int arraysize = 10;
    int order;
    int counter;
    int a[arraysize] = {2,6,4,45,32,12,7,33,23,98};

    cout<<"Enter 1 to sort in ascending order\n"
        <<"Enter 2 to sort in descending order\n";
    cin>>order;
    cout<<"Data items in original order\n";

    for(counter=0;counter<arraysize;counter++){
        cout<<setw(4)<<a[counter];
    }

    switch (order){
        case 1: cout<<"\nData items in ascending order\n";
                selectionSort(a, arraysize, ascending);
                break;
        case 2: cout<<"\nData items in descending order\n";
                selectionSort(a, arraysize, descending);
                break;
        default: return 0;
    }

    for(counter=0;counter<arraysize;counter++){
        cout<<setw(4)<<a[counter];
    }

    cout<<endl;
    cin.get();

    return 0;
}

链接:C++ on Windows - the console window just flashes and disappears. What's going on?

【问题讨论】:

  • 您是否在调试器中运行此程序以检查 a) 它是否到达 cin.get() 行和 b) 它是否在该行等待输入?
  • 如果default: return 0; 被击中怎么办?
  • 我已经进行了调试,似乎没有等待输入。克里斯F你是对的。但我仍然无法弄清楚原因。
  • 在这种情况下,请在调试器上单步执行整个程序,看看为什么不这样做。我怀疑@sharptooth 是正确的。
  • Sharptooth 是正确的,但如果 order 为 1 或 2,则仍会重现该行为。我更新了我的答案。

标签: c++ visual-studio-2010 visual-c++ console-application


【解决方案1】:

我的猜测是

default: return 0;

被执行。

编辑:

你是对的,这不是问题所在。阅读this

快速解决方法是:

cout<<endl;
cin.ignore(); // <---- ignore previous input in the buffer
cin.get();

但您可能需要阅读文章以获取有关该行为的更多信息。

【讨论】:

  • 是的,这有效并且窗口仍然存在。按下 1 或 2 时也会出现问题。默认情况下没有任何区别。谢谢!
  • id 使用 cin.clear() 代替,因为这会重置错误标志,因此您不会得到以前的 cin.get() 错误
  • cin.ignore() 在这里很重要。 clear 确实会保留错误标志,但 OP 需要忽略以前的输入
【解决方案2】:

我打赌你点击了默认开关标签 (return 0;)。这绕过了cin.get() - 每个返回语句都需要一个cin.get()

【讨论】:

    【解决方案3】:

    可能您的cin.get() 正在读取终止您的订单输入的换行符?您可以尝试拨打cin.get() 两次。

    【讨论】:

      【解决方案4】:

      所以当在 cin 之后使用 cin.get() 时,你应该始终记得在它们之间添加 cin.ignore() 。

      cin>>order;
      cin.ignore();
      /* 
         other codes here
       */
      cin.get();
      

      这主要是因为CIN会忽略缓冲区中的空格,所以在cin>>order之后,缓冲区中有一个“换行符”(\n),那么你的cin.get只是读取那个\n,然后你的程序成功执行并返回。 cin.ignore() 将忽略缓冲区中的先前输入。这真的很有帮助!

      我是中国的学生。你的问题是我可以在这里回答的第一个问题。我曾经遇到过和你一样的烦恼。我希望这可以帮助你。 忽略我蹩脚的英语,谢谢。

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 2012-11-13
        • 2014-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-06
        • 1970-01-01
        相关资源
        最近更新 更多