2012-06-21 41 views
-2

該代碼沒有錯誤,但是當我執行它時,沒有輸出,程序自動關閉,說程序已停止工作。用於任務調度的C++代碼

#include<unistd.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<time.h> 
#include<string.h> 
int main() 
{ 
char *timetoken; 
char currtime[7]; 
char schedtime[7]; 
int i; 
struct tm *localtimeptr; 
strcpy(schedtime,"15:25:00"); 
while(6!=9) 
{ 
    time_t lt; 
    sleep(1); 
    lt = time(NULL); 
    localtimeptr = localtime(lt); 
    timetoken=strtok(asctime(localtimeptr)," "); 
    for(i=1;i<5;i++) 
    timetoken=strtok('\0'," "); 
    if(i==3) 
    { 
      strcpy(currtime,timetoken); 
    } 
} 
      printf("The current time is: %s\n",currtime); 
      printf("We are waiting for: %s\n",schedtime); 
      if(!strcmp(currtime,schedtime)) 
      { 
              printf("Time to do stuff \n"); 
              system("C:\PROJECT X"); 
      }   
      getch(); 
      return 0;      
} 
+4

聽起來對我來說是一個錯誤。 –

+2

這到底是幹什麼的? 'system(「C:\ PROJECT X」);' – sarnold

+1

此外,您正在將8個字節複製到分配給7的schedtime。 – CatShoes

回答

3

的一些問題與發佈的代碼:

  • 此運行超過數組的末尾:

    strcpy(schedtime,"15:25:00"); 
    

    schedtime被聲明爲char[7],需要是char[9]( 8個字符加空終止符)。

  • 的第一個參數strtok()char*,而不是一個char

    timetoken=strtok('\0'," "); 
    

    您的意思是:

    timetoken=strtok(NULL," "); 
    
  • 沒有檢查timetoken不爲空或以確保它將適合到currtime

    if(i==3) 
    { 
        strcpy(currtime,timetoken); 
    } 
    

    將空指針傳遞給strcpy()幾乎肯定會導致分段錯誤(http://ideone.com/bacOG)。

5

我不知道你想做什麼,但是這是腥:

while(6!=9) 
{ 
    /* ... */ 
} 
/* ... more code ... */ 

6永遠不等於9,所以這是一個無限循環。無法擺脫循環,因此「更多代碼」部分中的任何內容都不會執行。這意味着您的printf不會執行,您的system也不會執行。你需要一些擺脫這個循環的方式。

爲了使代碼更易於閱讀(應該始終是頭等大事!),我建議只寫

while (true) { 
    ... 
} 

,以使其更清晰環路是應該的,除非明確運行break從它。

另注:此代碼

system("C:\PROJECT X"); 

是不正確的,因爲C++將解釋\P作爲轉義字符。爲了解決這個問題,逃避你的斜線:

system("C:\\PROJECT X"); 

對於另一個bug,在這個循環仔細一看:

for(i=1;i<5;i++) 
    timetoken=strtok('\0'," "); 
    if(i==3) 
    { 
     strcpy(currtime,timetoken); 
    } 

C++在解釋這個作爲

for(i=1;i<5;i++) { 
     timetoken=strtok('\0'," "); 
    } 

    if(i==3) 
    { 
     strcpy(currtime,timetoken); 
    } 

從這裏可以更明顯,這將不起作用,因爲if語句不在循環中。因此,i是永遠3.您大概意思

for(i=1;i<5;i++) { 
     timetoken=strtok('\0'," "); 
     if(i==3) 
     { 
      strcpy(currtime,timetoken); 
     } 
    } 

使清理你的代碼格式化(縮進,空格等)將有助於防止這種錯誤的努力。如果你已經聲明i爲for循環的本地,那麼你可能早就發現了這個。例如,此代碼無法編譯:

for(int i = 1; i < 5; i++) { 
     timetoken=strtok('\0'," "); 
    } 

    if(i==3) // i is not in scope 
    { 
     strcpy(currtime,timetoken); 
    } 

作爲一般規則,延遲聲明變量直到您絕對需要它們。它使得代碼更容易閱讀(使用中的變量趨向於接近使用它們的代碼)和更少的錯誤(如上所示)。

希望這可以幫助你開始!

+0

Thanx,但做了上述更改後,它顯示2條警告,聲明「(在函數'main':)」,「(傳遞'localtime'的arg 1使得整型指針沒有強制轉換)」,並且它像往常一樣自動關閉而不執行程序。我錯誤地將程序標記爲C++,當我用c編寫它時,sry。 – scheduling

1

您要複製更多的數據到schedtime比你分配:

strcpy(schedtime,"15:25:00"); 

複製的字符串是9個字符長,你有空間7.這可能不是問題本身,但如果內存排列的方式,localtimptr參與,與scheduletime打電話時printf(),可能未分配您的過程觸摸存儲器,從而在錯誤

2

這個序列是buffer overflow結束終止空字符不會在那裏。你已經在你的字符串內容的無關內存上塗寫了,所以什麼都可以發生在這一點之後。 (緩衝區溢出來的是最廣泛,最容易利用的安全問題。)

char schedtime[7]; 
strcpy(schedtime,"15:25:00"); 

你需要確保schedtime長到足以容納整個字符串,包括在最後的ASCII NUL字節。 schedtime[9]就足夠了。

這是寫一個無限循環一種奇怪的方式:

while(6!=9) 
{ 
... 
} 

更慣用的是while (1)for (;;)。堅持這些,讓別人更容易閱讀你的代碼。

您的代碼的細節可能存在其他錯誤,但在問題的設計中存在更大的錯誤;你假設在無限循環中運行sleep(1),並根據目標時間檢查時間的字符串值,最終會比較true - 這是不正確的假設。進入睡眠一秒鐘的過程可能會在後被喚醒約定的時間已經過去 - 當您的情況可能評估爲時,您的過程可能會在1000毫秒內正常睡眠

更好的辦法是根據所需的時間檢查當前時間,找出離開的秒數以及整個持續時間的sleep()。除非你的任務首先被一個信號喚醒,否則它將在所需時間的一秒之內。