用于任务调度的C ++代码

时间:2012-06-21 20:48:57

标签: 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 个答案:

答案 0 :(得分:5)

我不确定你要做什么,但这很可疑:

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

6总是不等于9,所以这是一个无限循环。没有办法摆脱循环,因此“更多代码”部分中的任何内容都不会执行。这意味着您的printf将无法执行,system也无法执行。你需要摆脱这种循环。

为了使代码更容易阅读(应始终是最优先考虑的事项!),我建议只写

while (true) {
    ...
}

更清楚地说明循环应该在你明确break之前运行。

另一个注意事项:此代码

system("C:\PROJECT X");

不正确,因为C ++会将\P解释为转义字符。要解决这个问题,请逃避斜线:

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

对于另一个错误,请仔细查看此循环:

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

作为一般规则,推迟声明变量,直到您完全需要它们为止。它使代码更容易阅读(使用中的变量往往接近使用它们的代码)和更少的错误(如上所示)。

希望这有助于您开始使用!

答案 1 :(得分: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)。

答案 2 :(得分: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 - 这是一个不正确的假设。进入睡眠状态一秒钟的过程可能会在指定时间过后被唤醒 - 当您的情况评估为 true时,您的过程可能会在1000毫秒内睡眠

更好的方法是根据所需时间检查当前时间,计算出离开的秒数,以及整个持续时间sleep()。除非您的任务首先被信号唤醒,否则它将在所需时间的一秒内。

答案 3 :(得分:1)

您正在将更多数据复制到schedtime而不是分配:

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

复制的字符串长度为9个字符,您有7个空格。这本身可能不是问题,但如果内存以涉及localtimptr的方式排列,则终止空字符不会在使用printf()调用scheduletime时可能会在那里,可能会触及未为您的进程分配的内存,从而以错误结束