2012-06-21 76 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()。除非你的任务首先被一个信号唤醒,否则它将在所需时间的一秒之内。