Ошибка вывода, когда ввод не является числом.C ++ - PullRequest
0 голосов
/ 12 октября 2011

Я делаю функцию, которая берет число из ввода пользователя и находит его абсолютное значение. Я хочу, чтобы он возвращал ошибку, если пользователь вводит что-то, кроме числа. Как бы я поступил так?

(Я знаю, что для многих из вас это, вероятно, простой вопрос, но я беру свой первый класс программирования на C ++, поэтому знаю очень мало. Любая помощь будет принята с благодарностью.)

Ответы [ 5 ]

3 голосов
/ 12 октября 2011

Если вы на самом деле пытаетесь программировать на идиоматическом 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.Они могут заметить, что не могут автоматически преобразовать то, что пользователь ввел в нужный вам формат, и дать вам возможность просто поднять руки с ошибкой - или попробовать интерпретировать необработанный ввод другим способом.

0 голосов
/ 12 октября 2011

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

PS лично я бы просто использовал boost :: lexical_cast <>, но для домашнего задания у вас, вероятно, не будет повышения для вас.Если вы станете профессиональным программистом на C ++, Boost станет одним из ваших лучших друзей за пределами STL.

0 голосов
/ 12 октября 2011

Вы проверяли atoi, или даже лучше strtol ?Я рекомендую начать там.

0 голосов
/ 12 октября 2011

Передайте свой номер в качестве ссылки и верните код ошибки. Использование аргумента функции в качестве выходного параметра.

bool parseNumber(int &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 failed\n";
}
0 голосов
/ 12 октября 2011

Относитесь к пользовательскому вводу как std::string или char *, затем проверьте, содержит ли он действительный символ цифры.

...