在C中使用atoi()的运行时错误

时间:2015-01-15 09:23:22

标签: c strtok atoi

我的问题陈述是接受一串数字并在屏幕上显示不同的数字。所以我尝试使用strtok()将字符串分成不同的数字,atoi()将这些数字转换为数字。但我收到了运行时错误..我还附上了一个示例代码。

输入

1 22 123 89 12 as a string

输出

1 22 123 89 12 as numbers

我需要对这些数字进行数学运算。所以我必须从整数转换为字符串。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main ()
{
    int i,j;
    char buffer [256];

    char *token;
    const char s[2]= " ";
    fgets (buffer, 256, stdin);

    token=strtok(buffer,s);
    i = atoi (token);
    printf("%d \n",i);
    while (token!=NULL)
                {token=strtok(buffer,s);
                i = atoi (token);
                printf("%d ",i);
                }

    return 0;
}

3 个答案:

答案 0 :(得分:2)

除了将参数更改为循环中的strtok来电之外,您还需要更改调用strtokatoi的顺序。现在,如果循环中的strtok返回NULL,它迟早会做什么呢?

相反,例如。

token=strtok(buffer,s);
while (token!=NULL)
{
    i = atoi (token);
    printf("%d ",i);
    token = strtok(NULL, " ");
}

答案 1 :(得分:1)

您需要在token之前检查atoi()是否为NULL。除此之外,strtol()的使用优先于atoi()

那就是说,我认为,为了你的目的,

while (token!=NULL)
            {token=strtok(buffer,s);

应该是

while (token!=NULL)
            {token=strtok(NULL,s);

否则,您最终会一遍又一遍地解析输入。

接下来,要避免\n读取fgets(),请使用分隔符字符串

 char * s = " \n";

答案 2 :(得分:0)

根据strtok()的man page

strtok()函数将字符串解析为一系列标记。在第一次调用strtok()时,应该在str中指定要解析的字符串。在应该解析相同字符串的每个后续调用中,str应为NULL。

char *strtok(char *str, const char *delim);

所以修改你的while循环如下(查看atoi()strtok()函数调用的顺序:

while (token!=NULL)
{
i = atoi (token);
printf("%d ",i);
token=strtok(NULL,s);
}

您还可以使用明显优于strtolatoi