好的,下面是代码:如果有错误,请评论
#include <stdio.h>
#include <windows.h>
main()
{
int h, m, s;
int d = 1000;
printf("Set the Clock time: \n");
scanf("%d%d%d", &h,&m,&s);
if (h > 24 || m > 60 || s > 60) {
printf("ERROR!");
exit(0);
}
while(1) {
s++;
if (s > 59) {
m++;
s = 0;
}
if (m > 59) {
h++;
m = 0;
}
if (h > 24) {
h = 1;
}
printf("\n Clock: ");
printf("%02d:%02d:%02d", h, m, s);
Sleep(d);
system("cls");
}
}所以,老实说,我不知道这段代码是否是好的和可读的:(这就是我在这里发布它的原因。
发布于 2021-09-24 22:27:49
而不是
if (h > 24 || m > 60 || s > 60),我以为
if (h >= 24 || m >= 60 || s >= 60)..。虽然允许24:00:00作为特例是可以的。
由于h,m,s是int,因此需要对负值进行范围检查。
if (h >= 24 || h < 0 || m >= 60 || m < 0 ....也许你想让闰秒像23:59:60那样成为宇宙时间?
// main()
int main()
// or
int main(void)// scanf("%d%d%d", &h,&m,&s);
if (scanf("%d%d%d", &h,&m,&s) != 3) {
printf("ERROR, not 3 integers\n");
exit(0);
}'\n'的stderr上最佳
//printf("ERROR!");
//exit(0);
fprintf(stderr, "ERROR!\n");
return EXIT_FAILURE;的一致性
而不是60和59,60,因为这是常识,如60秒/分钟,等等。
if (h >= 24 || m >= 60 || s >= 60) {
...
}
while(1) {
s++;
// if (m > 59) {
if (s >= 60) {#define SEC_PER_MIN 60
if (... s >= SEC_PER_MIN) {
...
}
while(1) {
s++;
if (s >= SEC_PER_MIN) {完成
printf("%02d:%02d:%02d", h, m, s);不一定输出,因为stdout通常是行缓冲的。
任一
printf("%02d:%02d:%02d", h, m, s);
fflush(stdout);
// or
printf("%02d:%02d:%02d\n", h, m, s);发布于 2021-09-19 20:37:35
您的代码允许某人输入时间"24:60:60",您的程序将接受它。我还看到,时钟意味着显示时间从01:00到24:59:59,但它也会接受0作为时间。要确保只在显示的时间接受输入,请编写:
if (h < 1 || h > 24 || m >= 60 || s >= 60)
...虽然24小时钟从00:00到23:59:59比较常见。
当您遇到错误时,正确的做法是将错误消息打印到stderr,然后使用非零退出代码(最好是EXIT_FAILURE )退出程序。
Sleep(1000)不完全睡眠1秒Sleep()函数可能不会休眠您指定的确切时间,即使这样,打印时间和清除屏幕也需要一些时间。所以最有可能的是,你的时钟会慢一点。要使它正常工作,您需要检查实际时间,并在调用Sleep()之前确定您需要睡眠多少,直到一秒钟过去。了解当前时间的最可移植的方法是使用clock()函数。您的循环应该如下所示:
clock_t next_time = clock();
while (1) {
/* Print clock */
...
clock_t current_time = clock();
next_time += CLOCKS_PER_SEC;
clock_t difference = next_time - current_time;
Sleep(difference * 1000 / CLOCKS_PER_SEC);
}请注意,虽然clock()可能在实践中工作,但它也不能保证运行速度与“壁时”一样快。您可以使用的平台相关函数是GetSystemTime() for Windows,gettimeofday()或clock_gettime()用于Linux和macOS。但原则是一样的。
system() system()将导致创建一个新的shell进程,然后该shell将解析并执行您给出的命令。对于一些简单的操作(比如清除屏幕)来说,这是非常低效的,而且也不独立于平台(在大多数其他操作系统中,您必须使用"clear"而不是"cls"作为命令)。
有更有效的方法来清除屏幕,例如使用ANSI转义码,但还有一个更简单的选择:永远不要转到下一行,只需覆盖当前行即可。您可以通过在格式字符串中使用\r来做到这一点,该字符串将光标移回行的开头。我建议你写:
printf("\rClock: %02d:%02d:%02d", h, m, s);
fflush(stdout);fflush()命令是必要的,以确保行立即写入屏幕,因为通常输出到stdout是行缓冲。
不幸的是,在给定的时间内没有标准的C函数来睡眠。在Windows上,您必须使用Sleep(),在大多数其他操作系统上,您必须使用POSIX nanosleep()函数。有关使您的程序为多个操作系统编译的一些建议,请参见这个StackOverflow帖子。
https://codereview.stackexchange.com/questions/268159
复制相似问题