2013-04-10 40 views
1

我有一個從K & R C 2nd版的atoi()函數的例子的問題。只能使用從0到9的字符。但是在我的程序的邏輯中,我做錯了什麼。在K&R C書中的atoi函數

所以有這樣的功能:

#include <stdio.h> 

int atoi(char s[]); 

int main() 
{ 
    int i; 
    char ch; 
    char co[50]; 
    int ci[50]; 

    while(ch != EOF) 
    { 

     for(i=0;i<50-1 && (ch=getchar()) != EOF && ch != '\n';++i) 
     { 
      co[i] = ch; 
      /*ci[i] = atoi(co[i]);*/ /*bugged*/ 
      ci[i] = atoi(co); 
      printf("%d \n",ci[i]); 
     } 
     if(ch == '\n') 
     { 
      co[i] = '\n'; 
     } 
     ++i; 
     co[i] = '\0'; 
    } 

    return(0); 

} 

/* as in the book: */ 
/* atoi: convert s to integer */ 

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); 
} 

下面是我得到的錯誤:

|In function 'main': 
19|warning: passing argument 1 of 'atoi' makes pointer from integer without a cast [enabled by default] 
3|note: expected 'char *' but argument is of type 'char' 
||=== Build finished: 0 errors, 1 warnings (0 minutes, 0 seconds) ===| 
+1

該錯誤消息是chrystal清除。 – 2013-04-10 18:25:18

+0

@JimBalter那個錯誤信息是chrystal清楚的。事實上,固定的,我是以錯誤的方式解析價值。編輯主帖。 – 2013-04-10 18:49:36

+0

抱歉拼寫錯誤,應該是「水晶」。請不要編輯您的代碼,因爲這意味着答案沒有意義。更正應作爲附錄添加。 – 2013-04-10 22:01:38

回答

1

atoi();函數需要指向字符串的指針。 char*就是這個道理警告warning: passing argument 1 of 'atoi' makes pointer from integer without typecase

聲明合作,如:char co[50];但呼籲atoi(co[i]);這是錯誤的,

通知它說,INT不燒焦。

像一個例子:

atoi("1");是有效的,但atoi('1');無效。

所以即使co就像"12345678"然後atoi(co)正確,但atoi(co[i])不正確。

+0

花了我一會兒才明白你在說什麼:) – 2013-04-10 18:50:44

+1

@CodrinH okh然後兩個鏈接對你很重要(1)[如何將char轉換爲C中的整數?](http://stackoverflow.com/questions/868496/how-to-convert-char-to-integer-in-c)和(2)[爲什麼是C字符文字整數而不是字符?](http://stackoverflow.com/questions/433895/why-are- c-character-literals-ints-instead-of-chars)你會發現有趣的。 – 2013-04-10 19:07:38

+0

我仍然試着理解爲什麼我定義func atoi(char s [])'而不只是'atoi(char s)',這是什麼情況下的區別? – 2013-04-16 17:30:56

2

(s[i] = '0') 

應該讀

(s[i] - '0') 

(注意減號而不是等號)。

這將字符'0' .. '9'轉換爲數字值0 .. 9

您也沒有正確地打電話給atoi()。它需要一個字符串,而不是一個char。你應該從循環之外調用它。

ch不是正確的類型(它應該是int)。

+1

編輯,這是最近misstype。但不是真正的問題 – 2013-04-10 18:24:21

+0

另一個缺陷是ch對getchar的返回值有錯誤的類型,並且與EOF進行比較。 – 2013-04-10 18:26:42

+0

int atoi(char s []),這不應該通過字符?只要它注意到[],一個等待一個字符串的函數應該是(int atoi(char s)? – 2013-04-10 18:27:20

1
printf("%c = ",co[i]); 
ci[i] = atoi(co[i]); 
printf("%d \n",ci[i]); 

您正試圖轉換一個char爲int,但一個char 一個整數值。所有你需要的是

printf("%c = %d\n", co[i], co[i]); 

如果你想要的是char的十進制值。如果你要做的是將ASCII碼轉換爲整數,那麼

printf("%c = %d\n", co[i], co[i] - '0'); 

會做。

+0

我管理這種方式:'int atoi(char s []) { int n; n =(int)(s); return n; }' – 2013-04-10 18:37:50

+0

@CodrinH這沒有任何意義。我認爲您需要閱讀和學習K&R或其他C語言教程,直到您對該語言有更好的理解。 – 2013-04-10 18:39:28