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'在做什么?有谁能解释一下这个功能的详细工作原理?
答案 0 :(得分:3)
请查看以下链接中的表格 -
该表称为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编码字符:字符串。 实际上,编码无关紧要,只要它有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
。