2017-03-11 95 views
1

我仍然是c中的初學者,並且在此處的do-while循環遇到問題。第一次運行順暢,但在我再次選擇「是」之後。它跳過目的地的scanf。它只會繼續,如果我輸入了一個乘客人數。雖然在循環中跳過c

#include <stdio.h> 
#include <conio.h> 
#include <windows.h> 

char destination=' '; 
int cash=' '; 
int passenger=' '; 
int multiply; 
char again; 
int change; 
main(){ 
do{ 

printf("enter destination : \n"); 
printf("[Q] Quezon\n"); 
printf("[K] Kamuning\n"); 
printf("[A] Araneta Center Cubao\n"); 
printf("[G] Gilmore\n"); 
printf("[L] Legarda\n"); 
printf("[S] Santolan\n"); 

scanf("%c",&destination); 
    int fare; 

    switch(destination){ 
     case 'q': 
     case 'Q': 
      printf("Quezon city\n\n"); 
      fare = 11; 

     break; 
     case 'k': 
     case 'K': 
      printf("Kamuning\n\n"); 
      fare = 13; 
     break; 

     case 'a': 
     case 'A': 
      printf("Araneta Center Cubao\n\n"); 
      fare = 14; 
     break; 

     case 'G': 
     case 'g': 

      printf("Gilmore\n\n"); 
      fare = 16; 
     break; 

     case 'L': 
     case 'l': 

      printf("Legarda\n\n"); 
      fare = 20; 
     break; 

     case 's': 
     case 'S': 
      printf("Santolan\n\n"); 
      fare = 25; 
     break; 

    } 



printf("Enter number of passenger\n"); 
scanf("%d",&passenger); 

multiply = passenger*fare; 

printf("\nTotal price: %d",multiply); 

printf("\nEnter cash: "); 
scanf("%d",&cash); 
change=cash-multiply; 

if(change<0){ 

printf ("\nchange: %d",change); 
printf ("\nNot enough cash "); 
} 

else { 
    printf ("\nchange: %d",change); 
    printf ("\nSuccess"); 

} 
printf("\n\n\nTry again? [y/n]: \n\n\n"); 
printf("---------------------------------------"); 
scanf("%s",&again); 

} 
while(again== 'Y' || again == 'y'|| change<0); 
getch(); 

}

+0

請注意,在正常情況下,'\ n'字符確實會刷新輸出緩衝區,所以將它放在行的末尾(而不是開頭)會更自然(*或習慣*)。 –

+0

@xing,實際上還需要另一個'scanf(「%c」,&destination);'。我希望OP能夠閱讀文檔並自行解決這個問題。 –

回答

1

這是因爲scanf()是一個可怕的功能!

在這種情況下,'\n'留在輸入流中;當你再次執行scanf()時,它會消耗它並繼續下一個。您可能能夠在第一次迭代之後檢查destination確實是'\n'

請注意,scanf()設計良好;這只是不直觀,這就是爲什麼我說這太可怕了,因爲正確使用它是非常困難的。

大多數書籍都會教scanf()的輸入,並且它們都不能解釋它是如何完全工作的,或者如果您完全使用它,應如何使用它。請閱讀scanf(3),但請仔細閱讀。然後您會注意到scanf("%d", &value)而不檢查它返回的內容,這完全是錯誤的。

+0

'scanf()'中有一些設計決定會根據經驗而改變。顯着的設計更改可以解決緩衝區長度問題。如果你有'char buffer [256];',你必須使用'「%255s」'(而不是''%256s「')作爲大小,而幾乎在其他地方,你使用緩衝區的大小,而不是一個小於緩衝區的大小。並且應該有一些機制允許你動態地指定大小,就像'printf()'中的一樣 - 但是'scanf()'預先''''爲了抑制賦值,所以很難與'printf( )'。這些問題無法修復。 –