2017-07-31 195 views
0

我正在创建一个简单的应用程序来跟踪我工作的时间。用户输入他们正在进行的工作分钟数量,程序将跟踪总数,直到终止。问题出现在程序第一次运行后,打印出第一条语句两次。我在一个无限循环内部完成了它,并且我对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 
+0

我猜 - 虽然绝不是我确定 - 你正在读取数字后面的换行符,发现它既不是我也不是T,并且进入循环的顶部。 –

+0

将输入视为一个字符串,将一些有些正则表达式绑定到'scanf'函数,即'[^ \ n]',然后将该字符串解析为一个整数。 – t0mm13b

+0

请注意,变量'minutesWorked'与'hoursWorked'和'totalMinutesWorked'对分开。如果你使用更系统的名字,你会让生活更轻松。可能使用'totalHoursWorked'来匹配'totalMinutesWorked'。名字对人类很重要;编译器并不担心。 –

回答

1

最好的解决办法是用fgets()代替scanf函数( ),但如果这不是一个选项,你可以在每次scanf调用后添加这一行来清除输入缓冲区:

fseek(stdin, 0, SEEK_END); 
+3

据我了解,在C中不能保证'stdin'应该支持定位请求,这意味着在这里调用'fseek()'可能会失败;这不是便携式的。有更好的方法可以清除输入流,比如惯用的'int c; while((c = getchar())!='\ n'&& c!= EOF);'。 –

+0

@DavidBowling表示同意 –