#c #error-handling #validation #iostream
#c #обработка ошибок #проверка #iostream
Вопрос:
Я создаю функцию, которая принимает число из введенных пользователем данных и находит его абсолютное значение. Я хочу, чтобы он возвращал ошибку, если пользователь вводит что-либо, кроме просто числа. Как бы я это сделал?
(Я знаю, что это, вероятно, простой вопрос для многих из вас, но я беру свой первый курс программирования на C , поэтому я знаю очень мало. Любая помощь была бы с благодарностью принята.)
Комментарии:
1. Не так много. Как я уже сказал, я довольно новичок в этом и действительно не знаю, как это сделать.
Ответ №1:
Если вы на самом деле пытаетесь программировать на идиоматическом C , игнорируйте (намеренно?) вам дают плохой совет. Особенно ответы, указывающие на функции C. C может быть в значительной степени обратно совместим с C, но его душа — это совершенно другой язык.
Ваш вопрос настолько основополагающий, что создает ужасное домашнее задание. Особенно, если вы настолько плывете по течению, что не знаете, как избежать conio.h и других трагедий. Итак, я просто собираюсь написать решение здесь:
#include <iostream>
#include <string>
// Your function is presumably something like this
// although maybe you are just using integers instead of floats
float myAbs(const float x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
int main(int argc, char* argv[]) {
// give a greeting message followed by a newline
std::cout << "Enter values to get |value|, or type 'quit'" << std::endl;
// loop forever until the code hits a BREAK
while (true) {
// attempt to get the float value from the standard input
float value;
std::cin >> value;
// check to see if the input stream read the input as a number
if (std::cin.good()) {
// All is well, output it
std::cout << "Absolute value is " << myAbs(value) << std::endl;
} else {
// the input couldn't successfully be turned into a number, so the
// characters that were in the buffer that couldn't convert are
// still sitting there unprocessed. We can read them as a string
// and look for the "quit"
// clear the error status of the standard input so we can read
std::cin.clear();
std::string str;
std::cin >> str;
// Break out of the loop if we see the string 'quit'
if (str == "quit") {
break;
}
// some other non-number string. give error followed by newline
std::cout << "Invalid input (type 'quit' to exit)" << std::endl;
}
}
return 0;
}
Это позволяет использовать естественные возможности классов iostream. Они могут заметить, когда им не удалось автоматически преобразовать то, что ввел пользователь, в нужный вам формат, и дать вам возможность просто развести руками с ошибкой или попытаться интерпретировать необработанный ввод по-другому.
Ответ №2:
Вы проверили atoi или еще лучший strtol? Я рекомендую начать с этого.
Ответ №3:
Передайте свой номер в качестве ссылки и верните код ошибки. Использование аргумента функции в качестве выходного параметра.
bool parseNumber(int amp;n)
{
...
//assign to number to n
// if number parsing is ok return true;
...
return false;
}
int main()
{
int number=0;
if(!parseNumber(number))
std::cout << "Number parsing failedn";
}
Ответ №4:
В дополнение к отличным ответам здесь, вы могли бы попробовать использовать std::stringstream:
http://cplusplus.com/reference/iostream/stringstream/stringstream/
По большей части он работает как любой другой поток, поэтому вы могли бы сделать что-то вроде:
int converted;
string user_input;
cin >> user_input;
stringstream converter(user_input);
if(!(converter >> converted)) {
cout << "there was a problem converting the input." << endl;
}
else {
cout << "input successfully converted: " << converted << endl;
}
HTH!
P.S. лично я бы просто использовал boost::lexical_cast<> , но для домашнего задания вам, вероятно, не будет доступен boost. Если вы станете профессиональным программистом на C , Boost станет одним из ваших лучших друзей за пределами STL.
Ответ №5:
Обработайте пользовательский ввод как std::string
или char *
, затем проверьте, содержит ли он допустимый цифровой символ.