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

      Комментарии к записи Преобразование строки в число (С++) отключены

Главная Форумы Программирование Программирование на С++ Преобразование строки в число (С++)

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 7 мес. назад.

  • Автор
    Сообщения
  • #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

    В языке Си для этой задачи можно использовать функцию 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()), в противном случае с потока будет получено первое целое число.

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