Читать только первое слово cin

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

Я оставляю вам код моей функции main для того, чтобы вы сделали себе идею.

int main(){
    char comando[10];
    ListaPersonas L = nuevaLista();

    mostrarOrdenes();
    cout << "orden>" << flush;
    cin >> comando;
    normalizar(comando);
    cout << endl;
    while(!sonIguales(comando,"fin")){
        ejecutarOpcion(comando, L);
        cout << endl;
        cout << "orden>" <<flush;
        cin >> comando;
        normalizar(comando);
        cout << endl;
    }
    return 0;
}

Вопрос состоит в том, что мне нужно, чтобы, в случае введена команда, которая не требовала бы параметров с каким-то параметром больше, была препятствовавший и одинокий работала главная команда; с моим настоящим кодом, в случае когда он пишет себе параметр больше этого, она интерпретирована как новая принятая в доме команда, что не желало.

Я был ты пытаешься с cin.getline() с различными delimitadores, но без успеха на данный момент.

Приветствие, большое спасибо и счастливый год!

1
задан 14.03.2017, 22:55
0 ответов

Я думаю, что твое приближение неправильное. Ты должен читать ввод пользователя под полного и после обрабатывать ее согласно твоей необходимости.

Предложение

Я предлагаю тебе читать ввод пользователя и отделять этот вход в Команду и Параметры. Если Команда не потребует параметров (или они опциональные), ты сможешь решать это на движении. Итак, создай объект, который подбирал бы Команду и Ваши Параметры:

struct Comando
{
    std::string Nombre{};
    std::vector<std::string> Parametros{};
};

Ты будешь нуждаться в функции, которая преобразует ввод пользователя в Comando, например эта:

Comando procesar(std::string &entrada)
{
    Comando resultado{};

    if (!entrada.empty())
    {
        normalizar(entrada); // Asumo que normalizar pasa a minúsculas la entrada
        const auto elementos = split(entrada);
        resultado.Nombre = *elementos.begin();
        std::copy(elementos.begin() + 1, elementos.end(), std::back_inserter(resultado.Parametros));
    }

    return resultado;
}

То, что делает функцию procesar он normalizar ввод и потом отделять каждое из слов, введенных пользователем (для этого я использую функцию split предложение в этом трэде), первое слово будет Командой и последующие были бы Вашими Параметрами.

Итак, ты мог бы читать линию ввода полному и принимать решение на основании полученного:

std::string entrada{};
std::getline(std::cin, entrada);
auto comando = procesar(entrada);

if (sonIguales(comando.Nombre, "fin") && !comando.Parametros.emtpy()){
    std::cout << "vaya locura! fin va sin parametros!\n";
}

Добавочные замечания.

Не используй array символов (char comando[10];) для чтения команд, используй лучше один std::string

Команда std::endl подразумевай также один std::flush.

Однажды имей объект Comando ты можешь работать прямо с тем же самым, так что функция ejecutarOpcion мог бы получать это такой который:

void ejecutarOpcion(const Comando &comando) { ... }
1
ответ дан 03.12.2019, 17:54

Ты мог бы тестировать это, чтобы брать первое слово твоего string:

sscanf(tuStrinf, "%s%*[^\n]", word);

Из этой формы ты достал бы первое слово твоего string и он проигнорировал бы в оставшуюся часть. Здесь я оставляю тебе учебник tutorialspoint, который смог бы serte утилиты.

Привет и счастливый год!

0
ответ дан 03.12.2019, 17:54