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 входных значений. то же самое, я должен понять, что выход и выход "ошибка, попробуйте еще раз"
Как с этим бороться?
Во-первых, вам нужно прочитать ввод как строку, а затем преобразовать строку в 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()){}
}
cin >> я >> j;
просто пропускает начальные пробелы, затем считывает два форматированных значения int
разделенные пробелами. Если вы введете больше, как в вашем примере, остальное останется в буфере входного потока. Если вы снова вызываете test()
, cin
читает из этого буфера.
Вы можете использовать cin.ignore(numeric_limits<streamsize>::max())
для решения этой проблемы при очистке буфера.
cin >> i >> j;
Как вы узнали, что эти извлечения были успешными? И каковы последствия следующей линии, если они этого не сделали? И обратите внимание, если вы провалите это извлечение, вы упадете в кроличью нору в бесконечный цикл, так какcin
никогда не очищается от состояния ошибки.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);
- просто googlestd::cin.ignore
и вы найдете кровавое большое число в примерах ;-P.