1. ホーム
  2. c++

[解決済み] c++ 文字列からintを解析する [重複]。

2022-03-15 11:54:36

質問

<ブロッククオート

重複の可能性があります。
C++で文字列をint型にパースする方法は?

いろいろ調べてみたのですが、アティオを使えという人もいれば、ダメだという人もいて、とにかくうまくいかないのです。

文字列をint型に変換する正しい方法を教えてください。

string s = "10";
int i = s....?

ありがとうございました。

解決方法は?

  • C++11では std::stoi としています。

     std::string s = "10";
     int i = std::stoi(s);
    
    

    なお std::stoi の例外を投げます。 std::invalid_argument 変換が実行できない場合、または std::out_of_range 変換の結果オーバーフローが発生した場合(すなわち、文字列値が int 型)を使用します。を使用することができます。 std::stol または std:stoll ただし int は、入力文字列に対して小さすぎるようです。

  • C++03/98では、以下のいずれかを使用することができます。

     std::string s = "10";
     int i;
    
     //approach one
     std::istringstream(s) >> i; //i is 10 after this
    
     //approach two
     sscanf(s.c_str(), "%d", &i); //i is 10 after this
    
    

ただし、上記の2つのアプローチは、入力の s = "10jh" . これらは、エラーを通知する代わりに10を返します。したがって、安全で堅牢な方法は、入力文字列を解析し、各文字を検証してそれが数字かどうかをチェックする独自の関数を書き、それに応じて動作させることです。以下に、堅牢な実装を一つ紹介します(未検証)。

int to_int(char const *s)
{
     if ( s == NULL || *s == '\0' )
        throw std::invalid_argument("null or empty string argument");

     bool negate = (s[0] == '-');
     if ( *s == '+' || *s == '-' ) 
         ++s;

     if ( *s == '\0')
        throw std::invalid_argument("sign character only.");

     int result = 0;
     while(*s)
     {
          if ( *s < '0' || *s > '9' )
            throw std::invalid_argument("invalid input string");
          result = result * 10  - (*s - '0');  //assume negative number
          ++s;
     }
     return negate ? result : -result; //-result is positive!
} 

を少し修正したものです。 私の別解 .