Перейти к содержанию

Последнее обновление:2026-10-12

Преобразование C++ string в int

Личный публичный аккаунт:

wechat

Сначала предложим решения:

  • atoi
  • strtol
  • stoi

Чем они различаются? Ниже сравнение с тестами.

Функции в стиле языка C

Сравнение atoi и strtol:

string str = "16s";
int a = atoi(str.c_str());
int b = strtol(str.c_str(), nullptr, 10);
Вывод:

atoi的结果为:16
strtol的结果为:16
Обе функции ищут с начала строки цифры, знак числа или десятичную точку и прекращают работу при встрече недопустимого символа.

Поэтому на символе s выше вывод прекращается и работа завершается досрочно; иначе говоря, если ваша строка — не число, или содержит десятичную точку и другие нецифровые символы, исключение не выбрасывается! Просто выводится 0.

Например:

string str = "asdsa";
int a = atoi(str.c_str());
int b = strtol(str.c_str(), nullptr, 10);
Вывод:

0
0
По сравнению с atoi strtol поддерживает преобразование в разных системах счисления, например в восьмеричной и др.

Например:

int b = strtol(str.c_str(), nullptr, 8);

Стиль C++

В C++ для преобразования в int можно использовать stoi; самая большая особенность этой функции по сравнению с первыми двумя — исключения!

Мы знаем, что в C++ по сравнению с языком C появились исключения — это и есть самая заметная возможность этой функции в C++.

Например:

string str1 = "asq,";
//    int c = stoi(str1);    // 报异常
string str2 = "12312";
int c = stoi(str2);     // ok
cout << c << endl;
Исключение такое:

terminate called after throwing an instance of 'std::invalid_argument'
what():  stoi

Своя реализация

То есть написать самому, вот так:

int stringToInt(const string &s) {
    int v;
    stringstream ss;
    ss << s;
    ss >> v;
    return v;
}
int main() {
    int i = stringToInt("2.3");
    cout<<i<<endl;
}

Похожие темы

Комментарии