2010-10-12 127 views
15

以下代碼片段來自C程序。比較用戶輸入的字符C

用戶輸入Y或N.

char *answer = '\0'; 

scanf (" %c", answer); 

if (*answer == ('Y' || 'y')) 
    // do work 

我想不通爲什麼這個if語句不計算爲true。

我檢查了y或n輸入與printf,它在那裏,所以我知道我得到的用戶輸入。另外,當我用1代替if語句的條件(使其爲真)時,它會正確評估。

回答

22

我看到兩個問題:

指針answernull指針,並且您試圖在scanf中解引用它,導致未定義的行爲

這裏你不需要指針char。你可以只用一個char變量:

char answer; 
scanf(" %c",&answer); 

下一頁,看看是否讀取字符是'y''Y'你應該做的:

if(answer == 'y' || answer == 'Y') { 
    // user entered y or Y. 
} 

如果你真的需要使用字符指針你可以這樣做:

char var; 
char *answer = &var; // make answer point to char variable var. 
scanf (" %c", answer); 
if(*answer == 'y' || *answer == 'Y') { 
+1

..或者通過調用'malloc()' – Arun 2010-10-12 04:25:48

+0

@ArunSaha:是的,或者讓它指向一個本地char變量。 – codaddict 2010-10-12 04:27:19

+0

爲什麼需要在scanf中的%c之前放一個空格?對我來說,它不工作,如果我刪除scanf中%c之前的空間。 – hunch 2015-08-11 13:50:11

9

answer不應該是一個指針,其目的顯然是保持一個字符。 scanf藉此字符的地址,所以它應該被稱爲

char answer; 
scanf(" %c", &answer); 

接下來,你的「或」語句的格式不正確。

if (answer == 'Y' || answer == 'y') 

你寫的最初要求與'Y' || 'y',這是我猜的結果比較answer是不是你想要做的相當的。

+0

我改變了它,但由於某種原因,if語句的主體仍然沒有評估 – 2010-10-12 04:21:45

+0

@Joe,如果你從我的答案中複製並粘貼,它可能會失敗。 – 2010-10-12 04:22:50

+0

是的,我發現了錯字,感謝 – 2010-10-12 04:26:55

5

因爲比較不起作用。 'Y' || 'y'是一個邏輯或運算符;它返回1(true),如果其任一參數爲true。由於'Y''y'都是真的,你與1

比較*answer你想要的是if(*answer == 'Y' || *answer == 'y')或者是:

switch (*answer) { 
    case 'Y': 
    case 'y': 
    /* Code for Y */ 
    break; 
    default: 
    /* Code for anything else */ 
} 
5

首先,你的answer VA riable應該是char,而不是char*

至於if語句:

if (answer == ('Y' || 'y')) 

這是第一評估'Y' || 'y',其在布爾邏輯(以及ASCII)爲真,因爲兩者都是「真」(非零)。換句話說,如果您以某種方式輸入CTRLA(同樣,對於ASCII碼,並且其中的真值等於1),您只會獲得if聲明* a

可以使用更正確的:

if ((answer == 'Y') || (answer == 'y')) 

,但你真的應該使用:

if (toupper(answer) == 'Y') 

因爲這是實現同一目的的更便攜的方式。


*一個你可能會奇怪,爲什麼我在各種條件句我把我的發言。儘管絕大多數C實現使用ASCII和某些已知值,但它不一定是由ISO標準規定的。我知道至少有一個編譯器仍然使用EBCDIC,所以我不喜歡做出毫無根據的假設。