2013-04-10 59 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