コンテンツにスキップ

最終更新:2026-10-12

C++ string から int への変換

個人 WeChat 公式アカウント:

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

この2つの関数はどちらも、文字列の先頭から数字や正負号、小数点を探し始め、不正な文字に遭遇すると終了します。

したがって、上記の s の文字の時点で出力されず、そこで終了します。つまり、文字列が数字でない場合、あるいは小数点などの数字以外の文字を含む場合でも、例外は発生しません!そのまま 0 を出力します。

例えば:

string str = "asdsa";
int a = atoi(str.c_str());
int b = strtol(str.c_str(), nullptr, 10);

出力:

0
0

strtol は atoi と比べて、複数の進数の変換をサポートしています。例えば8進数などです。

例えば:

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

C++ スタイル

C++ では stoi を使って int に変換できます。この関数の前の2つと比べた最大の特徴は:例外です!

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;
}

関連トピック

コメント