C 中的 Atoi 函数?
Atoi function in C?
int atoi(char* s)
{
int i,n;
n=0;
for (i=0; (s[i]>='0') && (s[i]<='9'); i++)
n = 10 * n + (s[i] - '0');
return n;
}
在此代码中,s[i]-'0' 在做什么?谁能解释一下这个函数的详细工作原理?
看看下面link中的table-
table 称为 ASCII Table,它是用于表示二进制世界中字符的字符编码方案之一。
您可以看到十进制数 0-9 在 ASCII table 中由数字 48-57 表示。所有数字 (0-9) 都存储为字符。
如果您的计算机为十进制数 0 存储 48,为十进制数 1 存储 49,为十进制数 2 存储 50,依此类推。
然后,要将 ASCII 码转换为十进制数,只需从 ASCII 码中减去 48 即可。
例如,
48 - 48 => 0
49 - 48 => 1
50 - 48 => 2
..等等
'0'也代表48。它是数字48的一种字符形式。所以,等式n = 10 * n + (s[i] - '0');
有'0'。
在您的函数中,s
是一个 ASCII 编码字符序列:一个字符串。 实际上,编码并不重要,只要它具有字符 0
到 9
作为一个序列。 假设它具有值 "123ABC"
,为了这个解释。
n
是输出数。在函数开始时它被初始化为零。
在循环的第一次迭代中我们有
i=0
s[i] = '1' (which is encoded as 49, in ASCII)
n = 0
所以数学是这样的:
n = n * 10 + (s[i] - '0')
n = 0 * 10 + ('1' - '0')
n = '1' - '0'
将字符语法转换为 ASCII 编码得到:
n = 49 - 48
n = 1
在下一次迭代中我们有:
i = 1
s[i] = '2' (ASCII 50)
n = 1
n = n * 10 + (s[i] - '0')
n = 1 * 10 + ('2' - '0')
n = 10 + ('2' - '0')
n = 10 + (50 - 48)
n = 10 + 2
n = 12
并且,在第三次迭代中:
i = 2
s[i] = '3' (ASCII 51)
n = 12
n = n * 10 + (s[i] - '0')
n = 12 * 10 + ('3' - '0')
n = 120 + ('3' - '0')
n = 120 + (51 - 48)
n = 120 + 3
n = 123
并且,在最后一次迭代中s[i] = 'A'
不在if
语句指定的范围内,所以循环退出。
如您所见,它已将字符串 "123"
正确转换为数字 123
。
In this code what is s[i]-'0'
doing?
在 C 语言中,每个 字符 像 '0'
、'A'
、'+'
、' '
都分配了一个 数值或代码。 C 要求 '0'
、'1'
、'2'
... '9'
的代码是连续的,但 不是 指定它们的值。
当代码执行下面的测试时,它知道 s[i]
在代码 '0'
和 '9'
中有一个值。由于这些代码是连续的,因此 仅 值 s[i]
可能是 '0'
、'1'
、'2'
... '9'
.
(s[i]>='0') && (s[i]<='9')
通过s[i]
减去'0'
,代码得到差值:
`0`-'0' --> 0
`1`-'0' --> 1
`2`-'0' --> 2
...
`9`-'0' --> 9
代码已成功将数字字符的字符代码转换为相应的整数值。
int atoi(char* s)
{
int i,n;
n=0;
for (i=0; (s[i]>='0') && (s[i]<='9'); i++)
n = 10 * n + (s[i] - '0');
return n;
}
在此代码中,s[i]-'0' 在做什么?谁能解释一下这个函数的详细工作原理?
看看下面link中的table-
table 称为 ASCII Table,它是用于表示二进制世界中字符的字符编码方案之一。
您可以看到十进制数 0-9 在 ASCII table 中由数字 48-57 表示。所有数字 (0-9) 都存储为字符。
如果您的计算机为十进制数 0 存储 48,为十进制数 1 存储 49,为十进制数 2 存储 50,依此类推。 然后,要将 ASCII 码转换为十进制数,只需从 ASCII 码中减去 48 即可。 例如,
48 - 48 => 0
49 - 48 => 1
50 - 48 => 2
..等等
'0'也代表48。它是数字48的一种字符形式。所以,等式n = 10 * n + (s[i] - '0');
有'0'。
在您的函数中,s
是一个 ASCII 编码字符序列:一个字符串。 实际上,编码并不重要,只要它具有字符 0
到 9
作为一个序列。 假设它具有值 "123ABC"
,为了这个解释。
n
是输出数。在函数开始时它被初始化为零。
在循环的第一次迭代中我们有
i=0
s[i] = '1' (which is encoded as 49, in ASCII)
n = 0
所以数学是这样的:
n = n * 10 + (s[i] - '0')
n = 0 * 10 + ('1' - '0')
n = '1' - '0'
将字符语法转换为 ASCII 编码得到:
n = 49 - 48
n = 1
在下一次迭代中我们有:
i = 1
s[i] = '2' (ASCII 50)
n = 1
n = n * 10 + (s[i] - '0')
n = 1 * 10 + ('2' - '0')
n = 10 + ('2' - '0')
n = 10 + (50 - 48)
n = 10 + 2
n = 12
并且,在第三次迭代中:
i = 2
s[i] = '3' (ASCII 51)
n = 12
n = n * 10 + (s[i] - '0')
n = 12 * 10 + ('3' - '0')
n = 120 + ('3' - '0')
n = 120 + (51 - 48)
n = 120 + 3
n = 123
并且,在最后一次迭代中s[i] = 'A'
不在if
语句指定的范围内,所以循环退出。
如您所见,它已将字符串 "123"
正确转换为数字 123
。
In this code what is
s[i]-'0'
doing?
在 C 语言中,每个 字符 像 '0'
、'A'
、'+'
、' '
都分配了一个 数值或代码。 C 要求 '0'
、'1'
、'2'
... '9'
的代码是连续的,但 不是 指定它们的值。
当代码执行下面的测试时,它知道 s[i]
在代码 '0'
和 '9'
中有一个值。由于这些代码是连续的,因此 仅 值 s[i]
可能是 '0'
、'1'
、'2'
... '9'
.
(s[i]>='0') && (s[i]<='9')
通过s[i]
减去'0'
,代码得到差值:
`0`-'0' --> 0
`1`-'0' --> 1
`2`-'0' --> 2
...
`9`-'0' --> 9
代码已成功将数字字符的字符代码转换为相应的整数值。