2017-09-24 46 views
-2

我一直在想如何將輸入的字符串轉換爲整數。我發現這個功能的在線代碼:試圖瞭解這個字符串到整數函數的工作原理

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 代碼工作,但我不明白爲什麼。具體來說,我不明白這部分是如何工作的:

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

如果n = 0,乘以10會如何影響結果?另外,如果限制因子是[c]!='\ 0',for循環如何結束?一個[c]如何等於零?

任何幫助將不勝感激

+1

這不是教程服務。如果您自己編寫代碼時遇到困難,請將其發佈並解釋發生了什麼問題。 –

+1

n最初只有0,此後一旦添加了'a [c] - '0',它將會改變,然後可能會受到後面乘法的影響。 – Annabelle

+0

提示:乘以10與後續迭代有關。顯然,不是第一個。 –

回答

0

在第一迭代n等於0時,一次迭代後N個相等的[C]的值。參見Horner計劃來了解它在數學上的工作原理。 -'0'在這裏將結果轉換爲整數。

0

「\ 0」是字符串的終止符和乘法* 10來計算的數十,數百等正確的值...

1

代碼工作[...]

不,因爲sign未初始化,但在字符串未以-開頭時使用。技術上,代碼有未定義的行爲

請忘記那個網站;它質量低下,不會教你適當的C編程。例如。這些都是由鐺產生的警告:

$ cc -c -Wall x.c 
x.c:4:7: warning: variable 'sign' is used uninitialized whenever 'if' condition is false 
     [-Wsometimes-uninitialized] 
    if (a[0] == '-') { // Handle negative integers 
     ^~~~~~~~~~~ 
x.c:8:7: note: uninitialized use occurs here 
    if (sign == -1) { // Set starting position to convert 
     ^~~~ 
x.c:4:3: note: remove the 'if' if its condition is always true 
    if (a[0] == '-') { // Handle negative integers 
    ^~~~~~~~~~~~~~~~~ 
x.c:2:14: note: initialize the variable 'sign' to silence this warning 
    int c, sign, offset, n; 
      ^
       = 0 
1 warning generated. 

任何站點自稱教授C必須使用遊離的警告的例子(除非代碼的點是展示錯誤)。

你是否意識到函數名稱toString有反向?它應該是fromStringtoInteger。這是該網站的一些糟糕的質量保證。

+0

不@Jens你有警告但這部分不是UB。他檢查一個特定的值。符號具有任何其他值(並且這是未初始化的局部變量的問題),代碼以絕對定義的方式運行。 –

+0

@ PeterJ_01然後你對未定義行爲的理解與C標準闡明的不同:* C99#J.2未定義行爲*,具有自動存儲持續時間的對象的值在不確定時使用(6.2 .4,6.7.8,6.8)。 – Jens