2009-12-09 6 views
0

De retour avec une autre question de débutant. En travaillant sur une fonction pour mon projet de devoirs, j'ai découvert que mon menu ne se fermerait pas lorsque j'appuierais sur X, cela a fonctionné il y a juste une heure et je n'ai rien changé dans main(). J'ai commenté tout le code dans mes fonctions juste pour être sûr que rien dans une fonction n'interfère. Je ne trouve tout simplement pas de problème et je serais reconnaissant pour toute aide.do-while a cessé de fonctionner

int main() 
{ 
    char val, enter; 
    int c; 
/* loopa med do-while */ 
do 
{ 
printf("===============================\n"); 
printf(" Olja i Norge AB\n"); 
printf("===============================\n\n"); 
printf(" Artikelregister\n"); 
printf(" A. Lista artiklar\n"); 
printf(" B. L\x84gg till artikel\n"); 
printf(" C. Radera artikel\n"); 
printf(" D. \x8Endra artikel\n\n"); 
printf(" Kundregister\n"); 
printf(" E. Lista kunder\n"); 
printf(" F. L\x84gg till kund\n"); 
printf(" G. Radera kund\n"); 
printf(" H. \x8Endra kund\n\n"); 
printf(" Ordrar\n"); 
printf(" I. Best\x84ll\n"); 
printf(" J. Lista ordrar\n\n"); 
printf(" X. Avsluta\n"); 
printf("\n==============================="); 
printf("\n===============================\n"); 
printf("V\x84lj: "); 
scanf("%c", &val); 

    do { 
     c = getchar(); 
    } while (c != EOF && c != '\n'); 

    switch(val) 
    { 
     case 'A': 
     case 'a': 
      printf("\n"); 
      artList(); 
      break; 

     case 'B': 
     case 'b': 
      printf("\n"); 
      artAdd(); 
      break; 

     case 'C': 
     case 'c': 
      artDel(); 
      break; 

     case 'D': 
     case 'd': 
      artEdit(); 
      break; 

     case 'E': 
     case 'e': 
      kundList(); 
      break; 

     case 'F': 
     case 'f': 
      kundAdd(); 
      break; 

     case 'G': 
     case 'g': 
      kundDel(); 
      break; 

     case 'H': 
     case 'h': 
      kundEdit(); 
      break; 

     case 'I': 
     case 'i': 
      order(); 
      break; 

     case 'J': 
     case 'j': 
      orderList(); 
      break; 

     case 'X': 
     case 'x': 
      break; 
    } 

    printf("\nTryck <ENTER> f\x94r att forts\x84tta."); 
    scanf("%c", &enter); 
    system("cls"); 

}while(val != 'X' || val != 'x'); 

return 0; 
} 
+2

Indice: au lieu de vérifier 'X' et 'x', utilisez les fonctions "tolower" ou "toupper" et comparez seulement une fois. Par exemple, après avoir lu dans votre personnage, convertissez-le en majuscules ou minuscules, puis comparez. Cela réduira la frustration et la taille de votre programme. ;-) –

+0

@Thomas: êtes-vous sûr que c'est une bonne règle? http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=415417 –

Répondre

17
do { ... } while (val != 'X' || val != 'x'); 

si val est 'X' que, bien que "convertis" à

do { ... } while (0 || 1); 

si val est 'x' que, bien que "convertis" à

do { ... } while (1 || 0); 

si val est 'a' que pendant que 'convertit' en

do { ... } while (1 || 1); 

Il n'évalue jamais à false.

Vous devez réécrire la condition - indice: utiliser && :)


Modifier

Oh ... c'est en supposant le "!= a priorité sur ||". Je ne sais jamais ce que la priorité est, et je toujours utiliser des parenthèses dans les expressions conditionnelles

do { ... } while ((val != 'X') || (val != 'x')); 
+0

L'homme, ça doit être l'une des choses les plus difficiles à apprendre pour les nouveaux développeurs, à en juger par toute la confusion que j'ai vu. –

+1

+1 pour avoir expliqué la réponse non seulement en donnant une réponse rapide pour obtenir un rep. – Tester101

+0

Merci, ce qui m'a dérouté, c'est que ça a bien fonctionné pendant une semaine, et maintenant il a juste commencé à fonctionner correctement je suppose –

2

Vous ne voulez pas vous aider trop, mais si vous regardez attentivement, cette condition:

while(val != 'X' || val != 'x'); 

Sera toujours évalué à vrai.

1

Au lieu de

while(val != 'X' || val != 'x') 

écrire

while(val != 'X' && val != 'x') 
0
val != 'X' || val != 'x' 

Si val == 'x', puis val != 'X', donc ce qui précède est vrai. De même, ce qui précède est vrai lorsque val == 'X'.

Questions connexes