K&R C手册中的atoi函数

K&R C手册中的atoi函数,c,getchar,atoi,kernighan-and-ritchie,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 &am

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

应该读

(s[i] - '0')
注意减号而不是等号

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

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

ch不是正确的类型,它应该是int。

应该读

(s[i] - '0')
注意减号而不是等号

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

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

ch不是正确的类型,它应该是int。

atoi;函数需要指向字符串的指针。char*这就是警告的原因:传递'atoi'的参数1将从不带typecase的整数生成指针

您声明co-like:char-co[50];但称阿托伊科为阿托伊科;这是错误的

注意它说int而不是char

例如:

atoi1;有效,但atoi'1';无效

所以,即使co是12345678,那么atoico是正确的,但atoico[i]是不正确的

atoi;函数需要指向字符串的指针。char*这就是警告的原因:传递'atoi'的参数1将从不带typecase的整数生成指针

printf("%c = ",co[i]);
ci[i] = atoi(co[i]);
printf("%d \n",ci[i]);
您声明co-like:char-co[50];但称阿托伊科为阿托伊科;这是错误的

注意它说int而不是char

例如:

atoi1;有效,但atoi'1';无效

所以,即使co是12345678,那么atoico是正确的,但atoico[i]是不正确的

printf("%c = ",co[i]);
ci[i] = atoi(co[i]);
printf("%d \n",ci[i]);
您正在尝试将字符转换为int,但字符是一个整数值。你所需要的只是

printf("%c = %d\n", co[i], co[i]);
如果您想要的是字符的十进制值。如果您试图将ASCII数字转换为整数,那么

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

您正在尝试将字符转换为int,但字符是一个整数值。你所需要的只是

printf("%c = %d\n", co[i], co[i]);
如果您想要的是字符的十进制值。如果您试图将ASCII数字转换为整数,那么

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


可以。

编辑,这是最近的错误类型。但这不是真正的问题吗?另一个错误是,ch的getchar返回值的类型错误,与EOF.int atoichar s[]相比,这不应该一个字符一个字符地传递吗?只要得到[],等待字符串的函数就应该是int-atoichar s?@CodrinH NPE提到了两个问题。@CodrinH您有一个概念上的问题。希望有人有教学技巧和耐心来解释,以克服你的困惑。编辑,这是最近的一个错误类型。但这不是真正的问题吗?另一个错误是,ch的getchar返回值的类型错误,与EOF.int atoichar s[]相比,这不应该一个字符一个字符地传递吗?只要得到[],等待字符串的函数就应该是int-atoichar s?@CodrinH NPE提到了两个问题。@CodrinH您有一个概念上的问题。希望有人具有教学技能和耐心,能够以这样的方式解释,以克服您的困惑。该错误信息是清晰的。@JimBalter该错误信息是清晰的。事实上,修正了,我以错误的方式划分了值。编辑了主要帖子。很抱歉拼写错误,应该是crystal。请不要就地编辑代码,因为这意味着答案没有意义。更正应作为附录添加。该错误消息为水晶清除。@JimBalter该错误消息为水晶清除。事实上,修正了,我以错误的方式划分了值。编辑了主要帖子。很抱歉拼写错误,应该是crystal。请不要就地编辑代码,因为这意味着答案没有意义。更正应该作为补遗添加。我是这样处理的:`intatoichars[]{intn;n=ints;return n;}`@CodrinH这毫无意义。我认为你需要阅读和学习K&R或其他一些C语言教程,直到你对该语言有了更好的理解。我认为你需要阅读和学习K&R或其他一些C语言教程,直到你对该语言有了更好的理解。我花了一些时间来理解你所说的:@CodrinH okh那么两个链接对你很重要1和2你会发现很有趣。我仍然试图理解我为什么定义func atoichar s[]不仅仅是atoichar s,这种情况的区别是什么?@CodrinH首先,你了解char co[10];与char-co不同;fist是一个数组,它以null“\0”结尾。在C中它将是一个字符串。其中,as second只是一个char变量。函数atoi排除了一个字符串,您不能将char变量传递给它。实际上,将字符传递给
atoi将是一个错误。@CodrinH欢迎Codrin,尽管我不确定是否可以解释你……我花了一段时间才理解你所说的:@CodrinH okh那么两个链接对你很重要1和2你会发现很有趣。我仍然试图理解为什么我定义func atoichar s[],而不仅仅是atoichar s,在这种情况下有什么区别?@CodrinH首先,你了解char co[10];与char-co不同;fist是一个数组,它以null“\0”结尾。在C中它将是一个字符串。其中,as second只是一个char变量。函数atoi排除了一个字符串,您不能将char变量传递给它。实际上,将字符传递给atoi将是一个错误。@CodrinH欢迎Codrin,尽管我不确定是否可以向您解释。。。