-2

这段代码没有错误,但是当我执行它时,没有输出,程序自动关闭,说程序已停止工作。

#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

4 回答 4

5

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

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

6 永远不等于 9,所以这是一个无限循环。没有办法跳出循环,因此“更多代码”部分中的任何内容都不会执行。这意味着您printf的 s 不会执行,您的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);
       }
   }

努力清理代码格式(缩进、空格等)将有助于防止此类错误。如果您已将ifor 循环声明为本地,那么您可能会更早发现这一点。例如,此代码无法编译:

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

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

作为一般规则,推迟声明变量,直到您绝对需要它们。它使代码更易于阅读(使用的变量往往与使用它们的代码接近)并且错误更少(如上所示)。

希望这可以帮助您入门!

于 2012-06-21T20:54:28.283 回答
3

发布的代码存在一些问题:

  • 这超出了数组的末尾:

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

    asschedtime声明为 a char[7],必须是char[9](8 个字符加上空终止符)。

  • 的第一个参数strtok()是 a char*,而不是 a char

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

    你的意思是:

    timetoken=strtok(NULL," ");
    
  • 没有检查timetoken不为空或确保它适合currtime

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

    传递一个空指针strcpy()几乎肯定会导致分段错误(http://ideone.com/bacOG)。

于 2012-06-21T20:52:25.570 回答
2

这个序列是缓冲区溢出。你已经用你的字符串的内容在不相关的内存上乱涂乱画,所以在这之后任何事情都可能发生。(缓冲区溢出曾经是最广泛和最容易被利用的安全问题。)

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

您需要确保schedtime足够长以容纳整个字符串,包括NUL末尾的 ascii 字节。schedtime[9]就足够了。

这是编写无限循环的一种奇怪方式:

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

更惯用的是while (1)or for (;;)。坚持这些,它们使其他人更容易阅读您的代码。

您的代码细节中可能还有其他错误,但问题的设计存在更大的错误;您假设sleep(1)在无限循环中运行并根据目标时间检查时间的字符串值最终会比较正确——这是一个不正确的假设。进入睡眠一秒钟的进程可能会在指定的时间过去后被唤醒- 当您的条件评估为true时,您的进程可能会在 1000 毫秒内睡眠。

更好的是检查当前时间与所需时间,找出还有多少秒,以及sleep()整个持续时间。除非您的任务首先被信号唤醒,否则它将在所需时间的一秒钟内。

于 2012-06-21T21:00:29.797 回答
1

您复制的数据schedtime多于分配的数据:

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

复制的字符串有 9 个字符长,你有 7 个字符的空间。这本身可能不是问题,但是如果以涉及的方式排列内存,则在调用时localtimptr不会出现终止的空字符,可能会碰到未为您的进程分配的内存,因此以错误结束printf()scheduletime

于 2012-06-21T20:55:15.520 回答