2014-09-27 113 views
1

我是C新手,我一直在尋找一個定製函數在C中將字符串轉換爲整數,我碰到這個算法,除了一個部分是非常有意義的。 -'0'究竟是做什麼的n = n * 10 + a[c] - '0';將字符串轉換爲數字時,爲什麼減去'0'?

int toString(char a[]) { 
     int c, sign, offset, n; 

     if (a[0] == '-') { // Handle negative integers 
     sign = -1; 
     } 

     if (sign == -1) { // Set starting position to convert 
     offset = 1; 
     } 
     else { 
     offset = 0; 
     } 

     n = 0; 

     for (c = offset; a[c] != '\0'; c++) { 
     n = n * 10 + a[c] - '0'; 
     } 

     if (sign == -1) { 
     n = -n; 
     } 

     return n; 
    } 

該算法沒有從我找到它的位置解釋,here

+1

見http://www.asciitable.com/ - 注意數字字符 – user2864740 2014-09-27 23:22:38

+0

否,*字符*''0的關係(和值) ''的值是48,'\ 0''是0是NUL。 – user2864740 2014-09-27 23:28:48

回答

4

減去'0'作品的原因是,從小數位開始的'0'開始順序排列字符代碼點,沒有間隙。換句話說,'5'的字符代碼大於'0'的字符代碼5; '6'的字符代碼大於'0'的字符代碼6,依此類推。因此,從另一個數字的代碼中減去零'0'的代碼將生成相應數字的值。

這種安排對於ASCII碼,EBSDIC,UNICODE十進制數碼等是正確的。對於ASCII碼,數字代碼是這樣的:

'0' 48 
'1' 49 
'2' 50 
'3' 51 
'4' 52 
'5' 53 
'6' 54 
'7' 55 
'8' 56 
'9' 57 
2

假設x具有'0''9'之間,x - '0'產生09之間的值的範圍內的值。因此,x - '0'基本上將十進制數字字符常量轉換爲其數字整數值(例如,'5'5)。

Ç說'0''9'是實現定義的值,但是C也保證'0''9'是連續的值。

+0

對不起,我還沒有理解這個,在這種情況下是'x','n'? – 2014-09-27 23:23:43

+0

@Bridenstine這裏'x'在你的程序中是'a [c]' – ouah 2014-09-27 23:25:01