为什么我的程序打印两次相同的语句?
我正在创建一个简单的应用程序来跟踪我工作的时间。用户输入他们正在进行的工作分钟数量,程序将跟踪总数,直到终止。问题出现在程序第一次运行后,打印出第一条语句两次。我在一个无限循环内部完成了它,并且我对scanf和printf没有很好的掌握,所以我认为这是我的失败所在。任何帮助,将不胜感激。为什么我的程序打印两次相同的语句?
这是程序的样子:
#include <stdlib.h>
#include <stdio.h>
void logic(int *minutesWorked, int *hoursWorked, int *totalMinutesWorked);
int main(void)
{
int minutesWorked = 0;
int hoursWorked = 0;
char letter = 0;
int totalMinutesWorked = 0;
while (1) {
printf("Enter I for input or T for total\n");
scanf("%c", &letter);
if (letter == 'i' || letter == 'I') {
printf("Please enter minutes worked\n");
scanf("%d", &minutesWorked);
logic(&minutesWorked, &hoursWorked, &totalMinutesWorked);
}
else if (letter == 't' || letter == 'T') {
printf("Hours worked is %d and minutes worked is %d\n", hoursWorked,totalMinutesWorked);
}
}
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */
void logic(int *minutesWorked, int *hoursWorked, int *totalMinutesWorked)
{
*totalMinutesWorked += *minutesWorked;
if (*totalMinutesWorked >= 60) {
*hoursWorked += *totalMinutesWorked/60;
*totalMinutesWorked = *totalMinutesWorked % 60;
}
} /* ----- end of function logic ----- */
这是它所显示的内容示例:
Enter I for input or T for total
I
Please enter minutes worked
100
Enter I for input or T for total
Enter I for input or T for total
I
Please enter minutes worked
33
Enter I for input or T for total
Enter I for input or T for total
T
Hours worked is 2 and minutes worked is 13
Enter I for input or T for total
Enter I for input or T for total
最好的解决办法是用fgets()代替scanf函数( ),但如果这不是一个选项,你可以在每次scanf调用后添加这一行来清除输入缓冲区:
fseek(stdin, 0, SEEK_END);
据我了解,在C中不能保证'stdin'应该支持定位请求,这意味着在这里调用'fseek()'可能会失败;这不是便携式的。有更好的方法可以清除输入流,比如惯用的'int c; while((c = getchar())!='\ n'&& c!= EOF);'。 –
@DavidBowling表示同意 –
我猜 - 虽然绝不是我确定 - 你正在读取数字后面的换行符,发现它既不是我也不是T,并且进入循环的顶部。 –
将输入视为一个字符串,将一些有些正则表达式绑定到'scanf'函数,即'[^ \ n]',然后将该字符串解析为一个整数。 – t0mm13b
请注意,变量'minutesWorked'与'hoursWorked'和'totalMinutesWorked'对分开。如果你使用更系统的名字,你会让生活更轻松。可能使用'totalHoursWorked'来匹配'totalMinutesWorked'。名字对人类很重要;编译器并不担心。 –