2016-07-24 51 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++是不同的語言,除非必須,否則沒有理由用糟糕的語言編寫它們的交集。 –