2015-02-04 2 views
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(); 
} 

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

Ниже приведено какое-то ложное испытание, что мы должны запустить код в части 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

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

вход индекс и Num 2

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

ввода индекса и Num 1 2 3

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

Как с этим справиться?

+2

Start, проверив это: 'CIN >> I >> J;' * Как вы знаете, эти экстракцию преуспели * И каковы последствия этой линии, что следует, если они * не *? ? И обратите внимание, если вы не справитесь с этим извлечением, вы упадете в кроличью дыру в бесконечный цикл, так как 'cin' никогда не очищается от состояния ошибки. – WhozCraig

+0

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

ответ

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

Да, большое спасибо, он выясняет мои вопросы, но как решить второй вопрос о количестве входных данных? – Jie

+0

Если получение одного набора данных в одной строке является обязательным, вам необходимо: 1. вывести эту строку из ввода, 2. разделить ее на части, используя пространство в качестве разделителя, 3. проверить количество деталей и преобразовать их в int. Вы можете найти и выбрать метод разделения строк здесь: http://stackoverflow.com/questions/236129/split-a-string-in-c –

1

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

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

Смежные вопросы