【问题标题】:Runtime error using atoi() in C在 C 中使用 atoi() 的运行时错误
【发布时间】:2015-01-15 09:23:22
【问题描述】:

我的问题陈述是接受一串数字并在屏幕上显示不同的数字。所以我尝试使用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;
}

【问题讨论】:

  • atoi NULL 指针上的段错误。
  • 在致电atoi 之前检查token != NULL。目前您在检查 null 之前调用 atoi。

标签: c strtok atoi


【解决方案1】:

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

所以改为例如

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

【讨论】:

    【解决方案2】:

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

    也就是说,我认为,为了达到你的目的,

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

    应该是

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

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

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

     char * s = " \n";
    

    【讨论】:

      【解决方案3】:

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

      你也可以使用strtol,明显比atoi好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-10
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        • 1970-01-01
        相关资源
        最近更新 更多