Преобразование строки в число (С++)

Программирование Программирование на С++ Решение задач на С++ Преобразование строки в число (С++)

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #2976
      @questioner

      Очень часто возникает необходимость преобразования строки в число. Например, во всевозможных парсерах и других случаях, где программа должна обработать некорректный ввод данных пользователем:

      #include <iostream>
      using namespace std;
      
      int main() {
        int value;
        
        cout << "enter integer value: ";
        cin >> value;
        
        if (cin.fail())
          cout << "fail" << endl;
        else 
          cout << "your value: " << value << endl;
      }

      В данном случае на вход оператора >> передается целое число, потому вызван будет istream& operator>> (int& val);, при этом если пользователь введет, например строку, начинающуюся с буквы — будет выставлен флаг ошибки (на экран выведется fail). Однако, если пользователь введет, например "1hello"- то программа отработает успешно,valueпримет значение 1, а в буфере клавиатуры останется "hello".

      istream_fail_flag

      Если такое поведение программы для вас не является корректным — можно считать у пользователя не число, а строку (или слово), т.к. ее легко проверить на корректность. Однако, при этом возникает необходимость преобразования строки в число.

    • #2983
      @admin

      В языке Си для этой задачи можно использовать функцию sscanf, которая ведет себя аналогично scanf, но данные берет не из буфера клавиатуры, а из строки (char*), переданной пользователем:

      if (sscanf(string, "%d", &value) == 1)
        printf("your number: %d\n", value);
      else 
        printf("wrong input\n");

      В случае успешного преобразования функция вернет количество преобразованных элементов (в данном случае единицу).

      В языке С++ для этой же цели применяются строковые потоки (std::stringstream). Для преобразования вам нужно поместить в поток строку, а затем считать из нее число нужного типа, например:

      #include <sstream>
      #include <string>
      #include <iostream>
      using namespace std;
      
      int main() {
        int value;
        string userString;
        
        stringstream sstr;
        
        cout << "enter integer: ";
        cin >> userString;
        
        sstr << userString; // put string into stringstream
        sstr >> value; // read integer from stringstream
        
        if (sstr.fail()) 
          cout << "wrong input" << endl;
        else
          cout << "your number: " << value << endl;  
      }

      Эта программа запрашивает у пользователя строку, помещает ее в поток, а затем пытается считать из потока целое число. Если в потоке нет числа — будет выставлен флаг ошибки (можно проверить с помощью stringstream::fail()), в противном случае с потока будет получено первое целое число.

Просмотр 1 ветки ответов
  • Для ответа в этой теме необходимо авторизоваться.