从cin中读取int数字,直到ESC按下C ++

时间:2013-11-24 13:40:25

标签: c++ escaping cin

我有兴趣找到解决以下问题的方法:

我必须从CIN读取int数字,直到用户按下ESC并计算正数和偶数的平均值。

我的问题是我不太确定如何正确地写停止条件。

这是我到目前为止所尝试的(不正常工作)

#include<iostream>
#include<math.h>

using namespace std;

void main()
{
    int c, sum=0, i=0;
cout<<"Insert characters: ";
while(cin>>c)
{
    i++;
    if((int)c>=0&&(int)c%2==0){
        sum+=(int)c;
    }
}
cout<<"Average: "<<(float)sum/i<<endl;
system("pause");
}

2 个答案:

答案 0 :(得分:3)

你可以试试这个

while((ch = cin.get()) != 27)
{
  i++;
  if((int)ch>=0&&(int)ch%2==0
  {
    sum+=(int)ch;
  }
}

这应该循环,直到按下esc

答案 1 :(得分:2)

转义字符既不是数字也不是空格。因此,如果程序传递了流中的字符,您只需读取整数,当输入espace字符时,流将自动失败(只关注问题的输入方面):

#include<iostream>

int main()
{
    int c = 0;
    while (std::cin >> c) {
        std::cout << "c=" << c << '\n';
    }
}

然而,操作系统是否将转义字符转发到流是一个不同的问题。例如,在UNIX上,转发转义字符将被转发,但仅在输入程序时才会转发,默认情况下是输入行。如果程序不应该等待返回键,则需要告知操作系统不要等待返回键。

这个问题似乎适用于Windows,但我不太了解Windows以确定如何更改终端设置(请参阅下文,了解可能仍然有效的内容)。在UNIX上,您可以使用ICANONtcgetattr()清除终端设置中的tcsetattr()标记。例如,您可以使用:

#include <iostream>
#include <termios.h>

int main()
{
    termios values;
    tcgetattr(0, &values);
    values.c_lflag &= ~ICANON;
    tcsetattr(0, TCSANOW, &values);

    int c = 0;
    while (std::cin >> c) {
        std::cout << "c=" << c << '\n';
    }
}

我认为Windows上有getch()可以让你无需等待一个角色。希望这也包括逃脱角色。如果是这种情况,您可以在getch()周围创建一个简单的流缓冲区,然后使用它:

#include <iostream>
#include <streambuf>
#include <whatever-declares-getch>

struct getchbuf
    : std::streambuf {
    static int const end = <getch()-error-value-goes-here>;
    char buffer;
    int underflow() {
        int result(traits_type::eof());
        if (this->gptr() == this->egptr() && (result = getch()) != end) {
            buffer = traits_type::to_char_type(result);
            this->setg(&buffer, &buffer, &buffer + 1);
        }
        return result;
    }
};

int main()
{
    getchbuf sbuf;
    std::istream in(&sbuf);

    int c = 0;
    while (in >> c) {
        std::cout << "c=" << c << '\n';
    }
}

你需要修补上面的代码以包含声明getch()(我认为它是<conio.h>但我不知道)的任何内容并指定getch()的错误指示符。