C 该代码在我调用“后导致segfault”;“原子能机构”;功能

C 该代码在我调用“后导致segfault”;“原子能机构”;功能,c,parsing,segmentation-fault,valgrind,C,Parsing,Segmentation Fault,Valgrind,我创建了一个函数来解析字符串,看起来像“NAME:Sebastion | AGE:4 | DATE:8/2/2005”,我试图得到“2005”年。我编写了一个函数,如下所示。当我调用“atoi”时,线路上出现SEGFULT。山谷向我展示了这一点 Invalid read of size 1 ==25142== at 0x5171167: ____strtol_l_internal (strtol_l.c:298) ==25142== by 0x5

我创建了一个函数来解析字符串,看起来像“NAME:Sebastion | AGE:4 | DATE:8/2/2005”,我试图得到“2005”年。我编写了一个函数,如下所示。当我调用“atoi”时,线路上出现SEGFULT。山谷向我展示了这一点

           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; 
 }

传递给此函数的字符串与其期望的字符串不匹配。如果不检查strtok是否返回了
NULL
,您就不会考虑这种可能性,并最终将
NULL
pionter发送到
atoi
,从而导致程序崩溃

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


也不要使用C++代码,如<代码>新< /C> > C中的变量或函数名。如果你试图从C转换为C++,

,则会对读者造成混淆。请发布一个。您尝试过在调试器中单步执行代码吗?该代码应该可以使用该字符串。然而,在现实生活中,您应该检查从strtok获得的返回值。segfault是由于将
NULL
指针传递到
atoi
而导致的。最后一段是不相关的,也是错误的。C和C++是不同的语言,没有必要用可怕的语言来编程,除非你必须这样。