为什么“keep_window_open()”不等待输入字符?

时间:2016-06-07 14:52:55

标签: c++ iostream

我是编程新手,我正在尝试自己学习C ++,而且我正在遵循“使用C ++编程原理和实践”。

我试图做一个练习,经过各种其他步骤后,我要求

  

“...改变循环的主体,使其每次只读取一个双重。定义两个变量来跟踪哪个是最小的,哪个是你到目前为止看到的最大值。每次通过循环写出来了   输入的值。如果它是迄今为止最小的,那么在数字之后写入最小的。如果它是迄今为止最大的,那么在数字“。

之后写入最大的

到目前为止,我编写了以下代码:

target

我的问题是当我输入一个字符时,例如“c”,程序结束,虽然程序应该以假设的方式结束,只有当我输入“|”时,才得到:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
inline void keep_window_open() { cout<<"\nType a character to exit: "; char ch; cin>>ch; }

int main()
{
double val1 = 0, smallest = 0, largest = 0;
int flag = 0;
while (cin >>val1) {
    if (val1=='|')
        break;
    else
        cout <<val1 <<'\n';
    if (flag==0) {
        smallest = val1;
        cout <<smallest <<" it's the smallest value so far.\n";
    }
    if (val1<smallest) {
        smallest = val1;
        cout <<smallest <<" it's the smallest value so far.\n"; }
    else if (val1>largest) {
             largest = val1;
             cout <<largest <<" it's the largest value so far.\n"; }
    ++flag;
}

keep_window_open();

return 0;
}

c Type a character to exit: Process returned 0 (0x0) execution time : ... Press any key to continue. 不等待输入字符。我只是无法理解会发生什么,以及为什么。有人有线索吗?

2 个答案:

答案 0 :(得分:0)

<强>问题

while (cin >>val1)将输入读入double。如果您输入的内容无法像双重读取那样&#34; |&#34;那么这将失败并导致你的循环退出。

然后在cin处于错误状态时尝试读取更多输入。

<强>解决方案

调用cin.clear()首先清除所有错误标记,然后cin.ignore(1000, '\n')以丢弃任何遗留在输入流中的内容。

inline void keep_window_open() 
{ 
    cout << "\nType a character to exit: "; 
    char ch; 

    cin.clear();
    cin.ignore(1000, '\n');
    cin >> ch; 
}

注意

if (val1=='|')
    break;

这段代码永远不会成为现实,因为如果你试图输入管道字符,你的while循环会在到达它之前落下。

答案 1 :(得分:0)

嗯,我认为问题在于你定义循环表达式的方式。 cin及其运算符“&gt;&gt;”返回可以使用的true / false值。它们返回一个iStream对象,这可能是一个可疑的转换为真或假通过幕后发生的自动化转换。但是,如果无法在变量中设置输入,则会返回null,就像尝试将“c”放入double中一样,而null则转换为false。

我建议你创建一个简单的while(true)循环,当你得到“|”时来自用户的字符(作为字符串),你打破了循环。直到那时循环继续。然后在循环内部解析你的值并根据你的逻辑(最小/最大)

进行处理