C ++: получить символ после пробела вместо или вернуть каретку - PullRequest
1 голос
/ 01 марта 2011

Хорошо, это похоже на мой последний вопрос, но то, что я закончил, было слишком сложным для чего-то такого простого.Мне просто нужно получить один символ или число (я буду знать, какой из них я получаю) из консоли после нажатия пробела вместо нажатия клавиши ввода.Я уверен, что должен быть способ, чтобы терминал читал ввод после пробела вместо '\ n'.Мне нужно прочитать входные данные из консоли, в которых последующие типы данных будут различаться в зависимости от того, что представляет собой первый вход, и я думаю, что чтение всей строки, разбор ее в строки, а затем разбор некоторых из них в целые числа является немного ненужным.

Итак, действительно ли это невозможно в C ++ или я просто еще не нашел его?

РЕДАКТИРОВАТЬ:

Для тех, у кого возникла эта проблема, я публикую свое решение,потому что теперь я чувствую себя идиотом.

#include <iostream>

using namespace std;

int main() {

    int command = 0, x = 0, y = 0, z = 0;
    char c;

    do {
        cin >> command;
        switch(command) {
            case 1:
                cin >> c >> x;
                cout << c << " " << x << endl;
                break;
            case 2:
                cin >> x >> y >> z;
                    cout << x << " " << y << " " << z << endl;
                    break;
        }
    } while (command); //Exits when command = 0;

    return 0;

}

Следующий cin внутри оператора switch будет читать из того же буфера, что и первый cin, так что в любом случае нет необходимости предварительно читать, что это за команда.Как вы можете видеть, это прекрасно работает для разных типов и количества входных данных после первого cin, поэтому нет необходимости использовать какое-либо другое решение.

Просто отправьте это кому-то, кто может иметь такую ​​же проблему, и неотличное понимание работы cin.

1 Ответ

2 голосов
/ 01 марта 2011

Просто выполните несколько вызовов для getchar() (или getch()) в цикле и проверяйте ввод каждую итерацию.

Что-то вроде этого (не проверено, но должно работать):

int loop = 1
int spacehit = 0
char last_c = 0;
while(loop)
{
    char c = getchar();
    switch(c)
    {
        case ' ':
            spacehit = 1;
            printf("hit '%c' before 'space'!\n", last_c);
            break;
        case 'x':
            printf("hit 'x' after 'space'!\n");
            spacehit = 0;
            break;
        case 27: // escape
            loop = 0;
            break;
        default:
            // do something, e.g. append the key in c to a string
            break;
    }
    last_c = c;
}

Редактировать: добавлен код для печати символа перед пробелом на случай, если это то, что вы искали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...