2017-07-31 6 views
0

Je crée une application simple pour suivre combien de temps je travaille. Un utilisateur entre la quantité de minutes de travail qu'il fait et le programme suivra le total jusqu'à la fin. Le problème est après la première exécution du programme pour imprimer sa première déclaration deux fois. Je l'ai à l'intérieur d'une boucle infinie et je n'ai pas une bonne compréhension de scanf et printf donc je pense que c'est là que réside mon échec. Toute aide serait appréciée.Pourquoi mon programme imprime-t-il deux fois la même déclaration?

C'est ce que le programme ressemble à:

#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 ----- */ 

Et ceci est un exemple de ce qu'il affiche:

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

Je devinerais-mais je ne suis pas du tout certain-que vous lisez le caractère de retour à la ligne après le nombre, en trouvant que ce n'est ni moi ni T, et aller au sommet de la boucle. –

+0

traite l'entrée comme une chaîne, avec une expression légèrement regex liée à la fonction 'scanf', c'est-à-dire' [^ \ n] ', puis analyse la chaîne en entier. – t0mm13b

+0

Notez que la variable 'minutesWorked' est séparée de la paire' hoursWorked' et 'totalMinutesWorked'. Vous rendriez la vie plus facile si vous utilisiez des noms plus systématiques. Utilisez probablement 'totalHoursWorked' pour correspondre à' totalMinutesWorked'. Les noms ont de l'importance pour les humains. le compilateur n'est pas aussi inquiet. –

Répondre

1

La meilleure solution serait d'utiliser fgets() au lieu de scanf (), mais si ce n'est pas une option, vous pouvez ajouter cette ligne pour effacer le tampon d'entrée après chaque appel scanf:

+3

Si je comprends bien, il n'est pas garanti en C que 'stdin' devrait supporter les requêtes de positionnement, ce qui signifie que l'appel de' fseek() 'pourrait échouer; ce n'est pas portable. Il existe de meilleurs moyens de vider de façon portative le flux d'entrée, tel que le 'int c 'idiomatique; while ((c = getchar())! = '\ n' && c! = EOF); ​​'. –

+0

@DavidBowling est d'accord –