我想做一个while循环,说“ Hello World”持续2秒500毫秒(2.5s)。我目前编写的代码适用于普通整数,但是如果我将其更改为使用浮点数,它将停止工作
有什么主意吗?
破损的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
float timeout = time(NULL) + 2.5;
while(time(NULL) < timeout) {
printf("Hello World\n");
}
return 0;
}
答案 0 :(得分:1)
您的代码存在的问题是:
您正在使用flaot
表示time()
的结果,该结果是一个大整数,由于浮点值的性质,可能导致转换不准确。
time()
函数的精度只能精确到秒,因此您的代码将永远不会运行2.5秒,而将始终运行3秒,因为您只能按以下步骤进行1秒。
要解决此问题,而无需使用浮点值(由于大多数与时间配合使用的函数都使用整数值,因此没有意义),您可以在Linux上使用gettimeofday()
函数,或使用{{ 3}}功能(如果您使用的是Windows。
Linux:
#include <stdio.h>
#include <sys/time.h>
unsigned long long get_time(void) {
struct timeval time;
gettimeofday(&time, NULL);
return time.tv_sec * 1000 * 1000 + time.tv_usec;
}
int main(int argc, char* argv[]) {
unsigned long long timeout = get_time() + 2500000;
// Accurate to the microsecond.
// 2.5 s == 2 500 000 us
while(get_time() < timeout) {
printf("Hello World\n");
}
return 0;
}
Windows:
#include <stdio.h>
#include <windows.h>
unsigned long long get_time(void) {
SYSTEMTIME time;
GetSystemTime(&time);
return time.wSecond * 1000 + time.wMilliseconds;
}
int main(int argc, char* argv[]) {
unsigned long long timeout = get_time() + 2500;
// Accurate to the millisecond.
// 2.5 s == 2 500 ms
while(get_time() < timeout) {
printf("Hello World\n");
}
return 0;
}
注意,在Windows上,准确性降低到毫秒,而在Linux上,准确性降低到毫秒。
答案 1 :(得分:-3)
我会坚持使用整数。
您可以这样做:
#include <stdio.h>
#include <time.h>
int main(int argc, char* argv[])
{
long int timeout = time(NULL)*10 + 25;
while(time(NULL)*10 < timeout)
{
printf("hello, world\n");
}
return 0;
}