Atoi功能在C?

时间:2016-04-05 10:33:37

标签: c atoi

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'在做什么?有谁能解释一下这个功能的详细工作原理?

3 个答案:

答案 0 :(得分:3)

请查看以下链接中的表格 -

http://www.asciitable.com/

该表称为ASCII表,它是用于表示二进制世界中字符的字符编码方案之一。

您可以在ASCII表中看到十进制数0-9由数字48-57表示。所有数字(0-9)都存储为字符。

如果您的计算机存储48为十进制数0,49为十进制数1,50为十进制数2等等。 然后,要将ASCII数转换为十进制数,您只需要从ASCII数中减去48。 例如,

48 - 48 =&gt; 0

49 - 48 =&gt; 1

50 - 48 =&gt; 2

..等等

'0'也代表48.它是数字48的字符形式。这就是为什么,等式n = 10 * n + (s[i] - '0');有'0'。

答案 1 :(得分:1)

  

在这段代码中//div[@class="left"]/div[@class="name"]/text() HERE^ 在做什么?

在C中,每个字符(例如s[i]-'0''0''A''+'都会被分配数值或代码。 C要求' ''0''1' ... '2'的代码是顺序的,但指定其值。

当代码执行以下测试时,它知道'9'在代码s[i]'0'中的值。由于这些代码是连续的,因此'9'可以是s[i]'0''1' ... '2'

'9'

(s[i]>='0') && (s[i]<='9') 中减去'0',代码会获得差异:

s[i]

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

答案 2 :(得分: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