8

Как преобразовать std::string в int?

1

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

Суть проблемы в том, что мы получаем уравнение в виде строки. Нам нужно разбить его, правильно отформатировать и решить линейные уравнения. При этом у меня не получается преобразовать строку в целое число.

Я знаю, что строка будет в формате (-5) или (25) и т.д., так что это определенно целое число. Но как извлечь его из строки?

Один из способов, который я рассматривал, это запустить цикл for/while по строке, проверить наличие цифрового символа, извлечь все цифры после этого, а затем посмотреть, есть ли ведущий символ '-', и, если он есть, умножить целое число на -1.

Однако это кажется немного излишне сложным для такой простой задачи. Есть идеи?

5 ответ(ов)

11

В C++11 появились удобные функции преобразования из std::string в числовые типы.

Вместо использования:

atoi(str.c_str())

вы можете воспользоваться:

std::stoi(str)

где str — это ваша строка, представляющая число в формате std::string.

Существуют версии для всех видов чисел: long stol(string), float stof(string), double stod(string) и т.д. Смотрите подробнее на http://en.cppreference.com/w/cpp/string/basic_string/stol.

0

Ваша реализация с использованием std::istringstream выглядит правильно, однако для полной корректности следует проверить флаги ошибок после извлечения значения. Это можно сделать следующим образом:

std::istringstream ss(thestring);
ss >> thevalue;

if (ss.fail()) {
    // Обработка ошибки: извлечение не удалось
    std::cerr << "Ошибка: невозможно преобразовать строку в значение." << std::endl;
} else {
    // Успешное извлечение значения
}

Проверка флагов позволяет убедиться, что извлечение прошло успешно и значение было корректно преобразовано из строки.

0

Для преобразования строки в число в C++, есть несколько распространенных способов. Рассмотрим их более подробно:

1. Использование std::stoi()

std::string str = "10";
int number = std::stoi(str);

Метод std::stoi() является самым простым и удобным способом преобразования строки в целое число. Он автоматически обрабатывает пробелы и выбрасывает исключение, если строка не может быть преобразована.

2. Строковые потоки (String streams)

std::string str = "10";
int number;
std::istringstream(str) >> number;

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

3. Использование boost::lexical_cast

#include <boost/lexical_cast.hpp>
std::string str = "10";
int number;

try
{
    number = boost::lexical_cast<int>(str);
    std::cout << number << std::endl;
}
catch (boost::bad_lexical_cast const &e) // Ошибка ввода
{
    std::cout << "error" << std::endl;
}

boost::lexical_cast позволяет преобразовывать типы данных очень легко и интуитивно. В случае некорректного входа, он выбрасывает исключение, что позволяет удобно обрабатывать ошибки.

4. Использование std::atoi()

std::string str = "10";
int number = std::atoi(str.c_str());

Функция std::atoi() также преобразует строку в целое число, но не генерирует исключения, если строка некорректна. Вместо этого она вернет 0 при ошибке, что может привести к путанице, если 0 может быть допустимым значением.

5. Использование sscanf()

std::string str = "10";
int number;
if (sscanf(str.c_str(), "%d", &number) == 1)
{
    std::cout << number << '\n';
}
else
{
    std::cout << "Bad Input";
}

Функция sscanf() позволяет извлекать данные из строки с использованием шаблонов формата. Она возвращает количество успешно прочитанных значений, что дает возможность проверять корректность ввода.

Вывод

Выбор метода зависит от конкретных требований вашего проекта. Если вам нужна простота и прямолинейность, используйте std::stoi(). Если вам требуется больше контроля над вводом и обработкой ошибок, рассмотрите использование boost::lexical_cast или строковых потоков.

0

Ваше решение действительно не поддерживает отрицательные целые числа, но оно успешно выделяет все положительные целые числа из входного текста, содержащего целые числа. Вы используете локаль numeric_only, что позволяет обрабатывать только цифры.

Вот ваш код:

int main() {
    int num;
    std::cin.imbue(std::locale(std::locale(), new numeric_only()));
    while (std::cin >> num)
        std::cout << num << std::endl;
    return 0;
}

Пример входных данных:

 the format (-5) or (25) etc... some text.. and then.. 7987...78hjh.hhjg9878

Вывод будет следующим:

 5
25
7987
78
9878

Класс numeric_only определяется следующим образом:

struct numeric_only: std::ctype<char> 
{
    numeric_only(): std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        static std::vector<std::ctype_base::mask> 
            rc(std::ctype<char>::table_size, std::ctype_base::space);

        std::fill(&rc['0'], &rc[':'], std::ctype_base::digit);
        return &rc[0];
    }
};

Обратите внимание, что эта реализация создаёт таблицу, в которой все символы от '0' до '9' рассматриваются как цифры, а все остальные символы - как пробелы. Это позволяет вам игнорировать текст и извлекать только числовые значения.

Если вы хотите протестировать ваше решение, вы можете использовать онлайн демо: http://ideone.com/dRWSj.

Это решение хорошо работает для извлечения положительных целых чисел, но имейте в виду, что любые возможные улучшения могут быть ограничены спецификациями задачи, которую вы пытаетесь решить.

0

В C++11 мы можем использовать функцию "stoi" для преобразования строки в целое число.

Вот пример использования функции stoi:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s1 = "16";
    string s2 = "9.49";
    string s3 = "1226";

    int num1 = stoi(s1);
    int num2 = stoi(s2);
    int num3 = stoi(s3);

    cout << "stoi(\"" << s1 << "\") равно " << num1 << '\n';
    cout << "stoi(\"" << s2 << "\") равно " << num2 << '\n';
    cout << "stoi(\"" << s3 << "\") равно " << num3 << '\n';

    return 0;
}

При использовании stoi, функция пытается преобразовать строку в целое число. Если строка содержит не числовые символы (например, "9.49"), stoi будет преобразовывать строку до первых нечисловых символов. На выходе вы получите значение 9 для s2, потому что stoi извлекает только целую часть числа. В случае, если строка не может быть преобразована в целое число, stoi выбросит исключение invalid_argument. Обязательно учитывайте эти моменты при работе с вводом данных.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь