我最近开始学习C,因为我在大学开设了一门课程。在我的一课中,我需要编写一个程序,将毫秒数转换为天,小时,分钟,秒和毫秒。 我使用这个源代码:
#include <stdio.h>
int main ()
{
long int time_ms;
int d, h, m, s, ms;
printf("insert the value in ms: \n");
scanf("%ld\n", &time_ms);
d = time_ms/(24*60*60*1000); //ms in a day
time_ms = time_ms%(24*60*60*1000); //reminder in ms
h = time_ms/(60*60*1000);
time_ms = time_ms%(60*60*1000);
m = time_ms/(60*1000);
time_ms = time_ms%(60*1000);
s = (time_ms/1000);
ms = time_ms%1000;
printf("%d d %d h %d m %d s %d ms\n",
d, h, m, s, ms);
}
我对它进行了编译,并且它可以工作,但是在我插入毫秒数后,MacO的外壳(我正在工作)在我输入&#34;退出&#34;之前不会打印任何内容。 。我错了什么?
答案 0 :(得分:3)
这是你的问题:
scanf("%ld\n", &time_ms);
您的序列中有\n
。这意味着在输入一个数字并按下回车后,scanf
读取数字,然后读取换行符,然后等待返回之前没有换行的内容。
从格式字符串中删除换行符:
scanf("%ld", &time_ms);
答案 1 :(得分:2)
您犯了一个经典错误:您使用了scanf
。有很多理由不使用scanf
永远,但现在重要的原因是scanf("%d\n")
将继续尝试读取输入在数字之后,直到它收到EOF或不是空格的东西。
您要做的是使用fgets
,无论内容是什么,都会读取整行输入,然后sscanf
来解析数字。当你开始编写更复杂的程序时,你会发现即使sscanf
也很麻烦,最好使用strtol
和strsep
这样的低级函数,但对于像这样的课堂练习{ {1}}没问题。