Экранирующий символ не является ни цифрой, ни пробелом. Таким образом, если программе передается символ в потоке, вы можете просто читать целые числа, и поток автоматически завершится ошибкой при вводе символов espace (просто сосредоточившись на входном аспекте вопроса):
#include<iostream>
int main()
{
int c = 0;
while (std::cin >> c) {
std::cout << "c=" << c << '\n';
}
}
Однако пересылаются ли escape-символы в поток операционной системой — это другой вопрос. Например, в UNIX-системах escape-символ будет переадресован, но только тогда, когда программа получает ввод, что по умолчанию происходит при вводе строки. Если программа не должна ждать ключа возврата, операционная система должна получить указание не ждать ключа возврата.
Вопрос, кажется, для Windows, но я недостаточно знаю о Windows, чтобы определить, как изменить там настройки терминала (хотя см. ниже что-то, что все еще может работать). В UNIX вы должны снять флаг ICANON
в настройках терминала, используя tcgetattr()
и 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()
, которые дают вам один символ без ожидания. Это, надеюсь, также включает в себя escape-символ. Если это так, вы можете просто создать простой буфер потока вокруг 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()
.
person
Dietmar Kühl
schedule
24.11.2013
i++
внутрь условияif()
, иначе вы будете считать все четные и нечетные целые числа. - person Brady   schedule 24.11.2013