将std::string类型的部分转换为整数

5

我有一个 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
}

如何做到这一点?
4个回答

10

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

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

6
如果您知道所有foo的字符都是数字,您可以使用(int) (foo[i] - '0'),它从字符中减去'0'的ascii值。这适用于所有数字,因为它们的ascii值是连续的。
您的第一次尝试失败了,因为foo[i]是一个单独的char,而atoi()需要一个C字符串。您的第二次尝试失败了,因为&foo[i]是对该字符的引用。

1
C和C++都要求用于表示十进制数字的值是连续的;这并不严格依赖于字符集。 - James McNellis

3

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

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

atoi函数接收以null结尾的字符串,而不是单个字符。减法计算方法之所以有效,是因为十个十进制数字在字符集中保证是连续的(显然,如果字符串中可能会有非数字字符,你需要进行适当的错误处理)。


0
一种简单的方法,非常接近你所拥有的,就是将字符插入到预定义的字符串中,如下所示:
std::string foo = "01001";
char str[] = {" "};
for (int i=0; i < foo.size(); ++i)
{
   str[0] = foo[i];
   int res = atoi( str );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接