C ++ Как проверить номер входа из Shell

0
void test() {
    int i ,j;
    cout << "enter the i and j" << endl;
    cin >> i >> j;
    if (j <= 5 && j > 0 && i > 0 && i <= 9) {
        cout << "right" <<endl;
    } else {
        cout << "error" << endl;
        test();
    }
}

int main(int argc, const char * argv[]) {
    test();
}

Как правильно проверить ввод из командной строки?

ниже приведено ложное испытание, что мы должны запустить код в части else.

foo ags

но результатом в командной строке является 28 строк информации об ошибках. Но то, что я хочу, это всего лишь один штрих-код "ошибка",

В чем проблема?

Другая

ниже мой C++ код:

void test(int array[], int length) {
    int index;  // the index of heap array that human want to modify
    int num;  // the number of heap in the index position
    cout << "input the index and num" << endl << flush;
    string si,sj;
    try{
        cin >> si >> sj;
        index = stoi(sj);
        num = stoi(si);
    }catch(std::exception e){
        cout << "error, try again" << endl;
        test(array, length);
    }
    if (index <= length && index > 0 && num > 0 && num <= array[index - 1]) {
        array[index - 1] -= num;
        // print(array, length);
    } else {
        cout << "error, try again" << endl;
        test(array, length);
    }
}

И теперь есть оболочка для запуска этого кода, но в оболочке есть вход, как показано ниже:

введите индекс и номер 2 1

это правильный

введите индекс и номер 2

у него просто 1 значение, и программа заблокирована здесь, чтобы ждать другого ввода, я должен понять это и вывести "ошибку, попробуйте еще раз",

введите индекс и число 1 2 3

это также неверно, потому что имеется более 2 входных значений. то же самое, я должен понять, что выход и выход "ошибка, попробуйте еще раз"

Как с этим бороться?

  • 2
    Начните с проверки этого: cin >> i >> j; Как вы узнали, что эти извлечения были успешными? И каковы последствия следующей линии, если они этого не сделали? И обратите внимание, если вы провалите это извлечение, вы упадете в кроличью нору в бесконечный цикл, так как cin никогда не очищается от состояния ошибки.
  • 0
    Вы можете комбинировать ala if (cin >> i >> j && j <= 5 && j > 0 && i > 0 && i <= 9) { ... так что if вводится только в том случае, если синтаксический анализ ввода тоже работает. cin.clear() вызов test() не будет работать, если вы сначала не cin.clear() ; затем cin.ignore(some-bloody-big-number-from-numeric-limits); - просто google std::cin.ignore и вы найдете кровавое большое число в примерах ;-P.
Теги:
command
cin

2 ответа

2
Лучший ответ

Во-первых, вам нужно прочитать ввод как строку, а затем преобразовать строку в int с проверкой std :: stoi на наличие ошибок. Предполагая, что вам нужно ony сообщение "error", используйте блок try-catch, который ловит только std :: exception и выводит "error". Во-вторых, чтобы повторить вызов test() в случае ошибки, вам нужно использовать какой-то lopp и не вызывать test() изнутри test(). Этот метод называется рекурсивным вызовом и используется для других целей, а не для простого повторения. Я изменил вашу функцию test(), чтобы вернуть значение bool, и вернет true в случае успеха и false в случае ошибки, а затем вызовет его из цикла while(), который будет повторять вызов в случае возврата false. О вас второй вопрос, вам нужно вводить номера отдельно, каждый на отдельной строке. Программа сможет проверять каждый номер по отдельности. См. Код:

#include <string>
#include <iostream>
bool test() {
    int i ,j;
    std::string si,sj;
    try{
        cout << "enter i:" << endl;
        cin >> si;
        i = std::stoi(si);
        cout << "enter j:" << endl;
        cin >> sj;
        j = std::stoi(sj);
    }catch(std::exception e){
        cout << "error";
        return false;
    }
    if (j <= 5 && j > 0 && i > 0 && i <= 9) {
        cout << "right" <<endl;
        return true;
    } else {
        cout << "error" << endl;
        return false;
    }
}

int main(int argc, const char * argv[]) {
    while(!test()){}
}
  • 0
    Да, большое спасибо, это выяснить мои вопросы, но как справиться со вторым вопросом о количестве входов?
  • 0
    Если необходимо получить один набор данных в одной строке, вам необходимо: 1. получить эту строку из ввода, 2. разделить ее на части, используя пробел в качестве разделителя, 3. проверить количество частей и преобразовать необходимые значения в int. Вы можете найти и выбрать метод разделения строк здесь: stackoverflow.com/questions/236129/split-a-string-in-c
1

cin >> я >> j; просто пропускает начальные пробелы, затем считывает два форматированных значения int разделенные пробелами. Если вы введете больше, как в вашем примере, остальное останется в буфере входного потока. Если вы снова вызываете test(), cin читает из этого буфера.

Вы можете использовать cin.ignore(numeric_limits<streamsize>::max()) для решения этой проблемы при очистке буфера.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню