2013-03-25 101 views
0

我決定製作一個播放tic tac腳趾的程序,但是我的if語句失敗了,它使用了其他的東西。我一直盯着它兩個小時,而我卻找不到任何錯誤!這裏是代碼:IF聲明無法正常工作

#include <stdio.h> 
#include <process.h> 

int main() 
{ 
char ans,ans2; 
double a,b,c,d,e,f; 
printf("Do you want to play? (y/n)\n"); //must make a loop 
scanf ("%c",&ans); 
if (ans == 'y') 
{ 
    printf("Do you want to be first?\n"); 
    scanf ("%c",&ans2); 
    if (ans2 == 'y') 
    { 
     printf("Make your choice.\n"); 
     printf(" 1 2 3\n"); 
     printf("a | | \n"); 
     printf(" - - -\n"); 
     printf("b | | \n"); 
     printf(" - - -\n"); 
     printf("c | | \n"); 
    } 
    else if (ans2 == 'n') 
    { 
     printf("option under construction!\n"); //must write this situation 
    } 
    else 
     printf("Invalid choice!\n"); 
} 
else if (ans == 'n') 
{ 
    printf("Goodbye!\n"); 
    system("pause"); 
} 
else 
    printf("Invalid choice!\n"); 

} 

請注意,程序還沒有完成(顯然)。

P.S.我昨天開始編程。

+4

'ans2'有什麼價值?打印出來到控制檯。我打賭你會發現它是10.什麼ASCII字符代碼10?對於你現在要學習的最重要的事情不是解決這個特定問題,而是如何調試一般的問題。 – 2013-03-25 13:12:48

+2

您是否嘗試過使用調試器? – Alon 2013-03-25 13:13:06

+1

顯示您的輸入和每個調試語句,但(幾乎肯定)第一條評論和@Joachim的答案是原因和解決方案。附:這個問題可能在SO和2^32次這裏回答了2^32次,其他地方的數據(只是谷歌scanf)。 – KevinDTimm 2013-03-25 13:17:21

回答

4

我想這個問題是,當你使用scanf來讀取一個字符時,它讀取這個字符,但是你也輸入了e換行符。然後下一個scanf調用將讀取該換行符而不是預期的字符。

最簡單的解決方法是告訴scanf跳過空白(如新行):

scanf(" %c", &ans); 

通知的%c之前的空間。

+0

或者只是使用getchar()來消耗剩餘的stdin; – 2013-03-25 13:17:36

+0

好吧,它現在可以工作,但我有空間時,我必須按兩次。任何想法如何解決它?編輯:哎呀!我剛剛看到了getchar();解。謝謝! – 2013-03-25 13:30:00

+0

@HristoKamenov請看我更新的答案。 – 2013-03-25 13:34:47

0

正如約阿希姆所說,問題在於第二個問題是scanf。如上所述,Imho會迴應新的路線,而不是空間。

無論如何,我的標準soultion將是scanf ("%c",&ans2)之前的fflush(stdin)

BTW:對每個if和else語句使用大括號。在黑客入侵某個新行後,它會減少愚蠢的錯誤,並增加可讀性。我的第一個猜測是錯誤的嵌套括號和案件..

編輯當我在評論教訓:不要使用fflush(stdin)!它可能會工作,但只有偶然的機會,因爲在stdin上的fflush()在ANSI-C中有未定義的行爲!

+0

'fflush()'只適用於輸出流,它不會對標準輸入做任何事情.. – 2013-03-25 16:46:55

+0

Huuuups ..再一次,我學到了一些新東西。看起來,它與我的編譯器一起工作,但在ANSI-C中它沒有定義,你是對的。感謝提示! – Oliver 2013-03-26 06:44:00