K& R C书中的atoi功能

时间:2013-04-10 18:20:25

标签: c getchar atoi kernighan-and-ritchie

我对K& R C第二版的atoi()函数有一些问题。只应使用0到9之间的字符。但是在我的程序逻辑的某个地方,我做错了。

所以有这个功能:

#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) ===|

3 个答案:

答案 0 :(得分:2)

(s[i] = '0')

应该阅读

(s[i] - '0')

(注意减号而不是等号)。

这会将字符'0' .. '9'转换为数值0 .. 9

您也没有正确地呼叫atoi()。它需要一个字符串,而不是char。您应该从循环外部调用它。

并且ch不是正确的类型(它应该是int)。

答案 1 :(得分:1)

atoi();函数需要指向字符串的指针。 char*这是警告warning: passing argument 1 of 'atoi' makes pointer from integer without typecase

的原因

你声明co :: char co[50];但是调用atoi(co[i]);这是错误的,

注意它说int不是char。

例如:

atoi("1");有效但atoi('1');无效。

所以即使co"12345678"相似,然后atoi(co)正确,atoi(co[i])也不正确。

答案 2 :(得分: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');

会做的。