在我调用“atoi”函数后,代码会导致段错误

时间:2016-07-24 03:06:12

标签: c parsing segmentation-fault valgrind

我创建了一个解析字符串的函数,看起来像“NAME:Sebastion | AGE:4 | DATE:8/2/2005”,我试图让年份成为“2005”。我写了一个函数如下。当我打电话给“atoi”时,会发生段错误。 valgrind告诉我

           Invalid read of size 1
    ==25142==    at 0x5171167: ____strtol_l_internal (strtol_l.c:298)
    ==25142==    by 0x516DB6F: atoi (atoi.c:27)
    ==25142==    by 0x400AB4: inYear (prelab8.c:115)
    ==25142==    by 0x40094E: main (prelab8.c:46)
    ==25142==  Address 0x0 is not stack'd, malloc'd or (recently) free'd



int inYear(char* string)
{
      char* word;
      word= strtok(string, "|");
      word= strtok(NULL,"|");
      word= strtok(NULL,"|");
      char * new;
      new = strtok(word,":");
      new= strtok(NULL,"/");
      new= strtok(NULL,"/");
      new= strtok(NULL,"/");
      //printf("%s\n",new);
      int year;
      year= atoi(new); // segfault 
      //printf("%d\n",year);
       if(year!=2005)
       return 0;

      return 1; 
 }

1 个答案:

答案 0 :(得分:3)

您传入此功能的字符串与预期的字符串不匹配。如果不检查strtok是否已返回NULL,您就不会考虑这种可能性,并最终将NULL pionter设为atoi,导致您的程序崩溃。

每次调用strtok之后,检查它是否返回NULL,如果是,则处理错误。

此外,不要使用C ++关键字(例如new)作为C中的变量或函数名称。如果您尝试将C语言转换为C ++,则会导致读者感到困惑。 / p>