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-

http://www.asciitable.com/

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 编码字符序列:一个字符串。 实际上,编码并不重要,只要它具有字符 09 作为一个序列。 假设它具有值 "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

代码已成功将数字字符的字符代码转换为相应的整数值。