在输入exit之前,程序不会打印结果

时间:2018-03-16 11:24:22

标签: c

我最近开始学习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;之前不会打印任何内容。 。我错了什么?

2 个答案:

答案 0 :(得分:3)

这是你的问题:

scanf("%ld\n", &time_ms);

您的序列中有\n。这意味着在输入一个数字并按下回车后,scanf读取数字,然后读取换行符,然后等待返回之前没有换行的内容。

从格式字符串中删除换行符:

scanf("%ld", &time_ms);

答案 1 :(得分:2)

您犯了一个经典错误:您使用了scanf。有很多理由不使用scanf 永远,但现在重要的原因是scanf("%d\n")继续尝试读取输入在数字之后,直到它收到EOF或不是空格的东西。

您要做的是使用fgets,无论内容是什么,都会读取整行输入,然后sscanf来解析数字。当你开始编写更复杂的程序时,你会发现即使sscanf也很麻烦,最好使用strtolstrsep这样的低级函数,但对于像这样的课堂练习{ {1}}没问题。