2016-07-24 260 views
2

我创建了一个函数来分析字符串,看起来像“NAME:Sebastion | AGE:4 | DATE:8/2/2005”,我试图得到年“2005年”。我写了一个函数如下。当我称之为“atoi”时,在线上出现段错误。在Valgrind的告诉我,我调用“atoi”函数后,代码会导致段错误

  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

[无法重现](http://melpon.org/wandbox/permlink/Ypx2LJdIJJag1Zjb)。请发布[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 – MikeCAT

+0

你有没有尝试单步执行调试器中的代码? – Cornstalks

+1

该代码应该与该字符串一起使用。但是,在现实生活中,你应该检查你从'strtok'得到的返回值。 segfault是由'NULL'指针传递给'atoi'引起的。 – user3386109

回答

3

字符串你传递给这个函数不匹配,预计。通过不检查strtok是否返回NULL,您不会考虑这种可能性并最终将NULL pionter改为atoi,导致程序崩溃。

调用strtok,检查它是否返回NULL,如果是的话处理错误。

此外,不要在C中使用C++关键字(如new)作为变量或函数名称。读者可能会感到困惑,并且如果尝试从C转换为C++会导致问题。

+0

最后一段是无关紧要的,IMO误导了。 C和C++是不同的语言,除非必须,否则没有理由用糟糕的语言编写它们的交集。 –

相关问题