C++中的atoi实现

Posted

技术标签:

【中文标题】C++中的atoi实现【英文标题】:atoi implementation in C++ 【发布时间】:2015-03-07 20:53:25 【问题描述】:

在 C++ 中给定 this implementation atoi

// A simple atoi() function
int myAtoi(char *str)

    int res = 0; // Initialize result

    // Iterate through all characters of input string and update result
    for (int i = 0; str[i] != '\0'; ++i)
        res = res*10 + str[i] - '0';

    // return result.
    return res;


// Driver program to test above function
int main()

    char str[] = "89789";
    int val = myAtoi(str);
    printf ("%d ", val);
    return 0;

到底是怎样的线

res = res*10 + str[i] - '0';

将一串数字转换为 int 值? (老实说,我对 C++ 相当生疏。)

【问题讨论】:

***.com/questions/15598698/… 如果函数不修改该数据,就没有理由将指针指向非常量数据。您只是强迫人们使用无法更改的字符串复制它或插入丑陋且可疑的演员表。 【参考方案1】:

标准要求字符集中的数字是连续的。这意味着您可以使用:

 str[i] - '0'

将字符的值转换为等效的数值。

res * 10 部分用于将运行总数中的左侧数字随机排列,以便为您插入的新数字腾出空间。

例如,如果您要将“123”传递给此函数,则在第一次循环迭代后res 将是1,然后是12,最后是123

【讨论】:

【参考方案2】:

该行的每个步骤都做两件事:

    将所有数字左移一位小数 将当前数字放在一个位置

str[i] - '0' 部分取对应数字的 ASCII 字符,顺序为“0123456789”,并从当前字符中减去“0”的代码。这会在 0..9 范围内留下一个数字,以判断字符串中那个位置的数字。

因此,当查看您的示例案例时,会发生以下情况:

    i = 0str[i] = '8': res = 0 * 10 + 8 = 8 i = 1str[i] = '9': res = 8 * 10 + 9 = 89 i = 2str[i] = '7': res = 89 * 10 + 7 = 897 i = 3str[i] = '8': res = 897 * 10 + 8 = 8978 i = 4str[i] = '9': res = 8978 * 10 + 9 = 89789

这就是你的结果。

【讨论】:

这假定编译目标字符集与执行字符集(语言环境)兼容。这是一个不错的选择。但两者都不太可能是 ASCII。 感谢您的回答【参考方案3】:

0123456789 的数字在 ASCII 中是连续的。

char 数据类型(和文字 chars,如 '0')是整数。在这种情况下,'0' 等价于 48。减去此偏移量将为您提供数字形式的数字。

【讨论】:

'0' 到 '9' 在所有标准化字符集中都是连续的,而不仅仅是 ASCII。有些实现支持 ASCII 以外的字符集,其中 '0' 不等于 48,但该技术仍然有效。【参考方案4】:

举个例子:

str = "234";

要将其转换为int,基本思想是这样处理字符串的每个字符:

res = 2*100 + 3*10 + 4
or
res = 0
step1: res = 0*10 + 2 = 0 + 2 = 2
step2: res = res*10 + 3 = 20 + 3 = 23
step3: res = res*10 + 4 = 230 + 4 = 234

现在因为“234”中的每个字母实际上都是一个字符不是int 并且有 与之相关的 ASCII 值

ASCII of '2' = 50
ASCII of '3' = 51
ASCII of '4' = 52
ASCII of '0' = 48

参考:http://www.asciitable.com/

如果我这样做了:

res = 0;
res = res*10 + str[0] = 0 + 50 = 50
res = res*10 + str[1] = 500 + 51 = 551
res = res*10 + str[2] = 5510 + 52 = 5562

那么我会得到 5562,这是我们不想要的。

记住:在算术表达式中使用字符时,它们的 ASCII 值会用完(char -> int 的自动类型转换)。因此我们需要将字符 '2'(50) 转换为 int 2,我们可以这样完成:

'2' - '0' = 50 - 48 = 2

让我们用这个更正再次解决它:

res = 0
res = res*10 + (str[0] - '0') = 0 + (50 - 48) = 0 + 2 = 2
res = res*10 + (str[1] - '0') = 20 + (51 - 48) = 20 + 3 = 23
res = res*10 + (str[2] - '0') = 230 + (52 - 48) = 230 + 4 = 234

234 是必填答案

【讨论】:

以上是关于C++中的atoi实现的主要内容,如果未能解决你的问题,请参考以下文章

相当于atoi

atoi()函数实现

模拟实现atoi函数

模拟实现atoi - 字符串中的数字字符转化为整形数

实现atoi函数

在 C++ 中使用 atoi 将 char 数组转换为 int 值