2017-07-31 194 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表示同意 –