簡體   English   中英

在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'在做什么? 誰能解釋這個功能的詳細工作嗎?

在下面的鏈接中查看表格-

http://www.asciitable.com/

該表稱為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編碼字符的序列:字符串。 實際上,編碼並不重要,只要它具有字符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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM