atoi在C++中的实现
atoi implementation in C++
给定 this implementation C++ 中的 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] != '[=10=]'; ++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';
将一串数字转换成整型值? (老实说,我对 C++ 相当生疏。)
标准要求字符集中的数字是连续的。这意味着您可以使用:
str[i] - '0'
将字符的值转换为等效的数值。
res * 10
部分是将 运行 总数中的数字向左洗牌,以便为您要插入的新数字腾出空间。
例如,如果要将“123”传递给此函数,则 res
在第一次循环迭代后将是 1
,然后是 12
,最后是 123
.
数字 0123456789
在 ASCII 中是连续的。
char
数据类型(和文字 char
类似 '0'
)是整数。在这种情况下,'0'
等同于 48
。减去这个偏移量将得到数字形式的数字。
该行的每一步都做两件事:
- 将所有数字左移一个小数位
- 将当前数字放在个位
部分str[i] - '0'
取对应数字的ASCII字符依次为“0123456789”,并从当前字符中减去'0'的代码。这会在 0..9 范围内留下一个数字,表示字符串中该位置的数字。
因此,在查看您的示例案例时,会发生以下情况:
i = 0
→ str[i] = '8'
: res = 0 * 10 + 8 = 8
i = 1
→ str[i] = '9'
: res = 8 * 10 + 9 = 89
i = 2
→ str[i] = '7'
: res = 89 * 10 + 7 = 897
i = 3
→ str[i] = '8'
: res = 897 * 10 + 8 = 8978
i = 4
→ str[i] = '9'
: res = 8978 * 10 + 9 = 89789
这是你的结果。
举个例子:
str = "234";
将其转换为int,基本思路是这样处理string的每个字符:
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”中的每个字母实际上是一个 字符,不是整数
并具有 与之关联的 ASCII 值
ASCII of '2' = 50
ASCII of '3' = 51
ASCII of '4' = 52
ASCII of '0' = 48
如果我这样做了:
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 是必填项
给定 this implementation C++ 中的 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] != '[=10=]'; ++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';
将一串数字转换成整型值? (老实说,我对 C++ 相当生疏。)
标准要求字符集中的数字是连续的。这意味着您可以使用:
str[i] - '0'
将字符的值转换为等效的数值。
res * 10
部分是将 运行 总数中的数字向左洗牌,以便为您要插入的新数字腾出空间。
例如,如果要将“123”传递给此函数,则 res
在第一次循环迭代后将是 1
,然后是 12
,最后是 123
.
数字 0123456789
在 ASCII 中是连续的。
char
数据类型(和文字 char
类似 '0'
)是整数。在这种情况下,'0'
等同于 48
。减去这个偏移量将得到数字形式的数字。
该行的每一步都做两件事:
- 将所有数字左移一个小数位
- 将当前数字放在个位
部分str[i] - '0'
取对应数字的ASCII字符依次为“0123456789”,并从当前字符中减去'0'的代码。这会在 0..9 范围内留下一个数字,表示字符串中该位置的数字。
因此,在查看您的示例案例时,会发生以下情况:
i = 0
→str[i] = '8'
:res = 0 * 10 + 8 = 8
i = 1
→str[i] = '9'
:res = 8 * 10 + 9 = 89
i = 2
→str[i] = '7'
:res = 89 * 10 + 7 = 897
i = 3
→str[i] = '8'
:res = 897 * 10 + 8 = 8978
i = 4
→str[i] = '9'
:res = 8978 * 10 + 9 = 89789
这是你的结果。
举个例子:
str = "234";
将其转换为int,基本思路是这样处理string的每个字符:
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”中的每个字母实际上是一个 字符,不是整数 并具有 与之关联的 ASCII 值
ASCII of '2' = 50
ASCII of '3' = 51
ASCII of '4' = 52
ASCII of '0' = 48
如果我这样做了:
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 是必填项