【问题标题】:std::string part into integerstd::string 部分转换为整数
【发布时间】:2011-06-11 07:49:19
【问题描述】:

我有一个 std::string:01001,我想获取每个数字:

std::string foo = "01001";
for (int i=0; i < foo.size(); ++i)
{
   int res = atoi( foo[i] );  // fail
   int res = atoi( &foo[i] ); // ok, but res = 0 in any case
}

怎么做?

【问题讨论】:

    标签: c++ string int


    【解决方案1】:

    每个数字都可以通过简单的减法得到:

    int res = foo[i] - '0';
    

    atoi 采用以空字符结尾的字符串,而不是单个字符。减法方法有效,因为十进制数字保证在字符集中是连续的(显然,如果字符串中有可能包含非数字字符,则需要进行适当的错误处理)。

    【讨论】:

      【解决方案2】:

      这是我看到的最简单的方法:

      std::string foo = "01001";
      for (int i=0; i < foo.size(); ++i)
      {
         int res = foo[i] - '0';
      }
      

      【讨论】:

        【解决方案3】:

        如果您知道foo 的所有字符都是数字,则可以使用(int) (foo[i] - '0') 从字符中减去'0' 的ascii 值。这适用于所有数字,因为它们的 ascii 值是连续的。

        您的第一次尝试失败了,因为 foo[i] 是单个 char,而 atoi() 需要一个 cstring。您的第二次尝试失败了,因为 &amp;foo[i] 是对该字符的引用。

        【讨论】:

        • C 和 C++ 都要求用于表示十进制数字的值是连续的;它并不严格依赖于字符集。
        【解决方案4】:

        一种非常接近您所拥有的简单方法是将字符插入到预定义的字符串中,如下所示:

        std::string foo = "01001";
        char str[] = {" "};
        for (int i=0; i < foo.size(); ++i)
        {
           str[0] = foo[i];
           int res = atoi( str );
        }
        

        【讨论】:

          猜你喜欢
          • 2012-09-19
          • 1970-01-01
          • 1970-01-01
          • 2016-01-28
          • 1970-01-01
          相关资源
          最近更新 更多