此代码没有错误,但是当我执行它时,没有输出,程序会自动关闭,说程序已经停止工作。
#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;
}
答案 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
时可能会在那里,可能会触及未为您的进程分配的内存,从而以错误结束