[英]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'在做什么? 誰能解釋這個功能的詳細工作嗎?
在下面的鏈接中查看表格-
該表稱為ASCII表,它是用來表示二進制世界中字符的字符編碼方案之一。
您可以在ASCII表中看到十進制數字0-9由數字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[i]-'0'
在做什么?
在C語言中,每個像'0'
, 'A'
, '+'
, ' '
類'0'
字符都被分配了一個數值或代碼。 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
代碼已成功將數字字符的字符代碼轉換為相應的整數值。
在您的函數中, 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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.