以下代碼片段來自C程序。比較用戶輸入的字符C
用戶輸入Y或N.
char *answer = '\0';
scanf (" %c", answer);
if (*answer == ('Y' || 'y'))
// do work
我想不通爲什麼這個if
語句不計算爲true。
我檢查了y或n輸入與printf
,它在那裏,所以我知道我得到的用戶輸入。另外,當我用1代替if語句的條件(使其爲真)時,它會正確評估。
以下代碼片段來自C程序。比較用戶輸入的字符C
用戶輸入Y或N.
char *answer = '\0';
scanf (" %c", answer);
if (*answer == ('Y' || 'y'))
// do work
我想不通爲什麼這個if
語句不計算爲true。
我檢查了y或n輸入與printf
,它在那裏,所以我知道我得到的用戶輸入。另外,當我用1代替if語句的條件(使其爲真)時,它會正確評估。
我看到兩個問題:
指針answer
是null
指針,並且您試圖在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') {
answer
不應該是一個指針,其目的顯然是保持一個字符。 scanf
藉此字符的地址,所以它應該被稱爲
char answer;
scanf(" %c", &answer);
接下來,你的「或」語句的格式不正確。
if (answer == 'Y' || answer == 'y')
你寫的最初要求與'Y' || 'y'
,這是我猜的結果比較answer
是不是你想要做的相當的。
我改變了它,但由於某種原因,if語句的主體仍然沒有評估 – 2010-10-12 04:21:45
@Joe,如果你從我的答案中複製並粘貼,它可能會失敗。 – 2010-10-12 04:22:50
是的,我發現了錯字,感謝 – 2010-10-12 04:26:55
因爲比較不起作用。 '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 */
}
首先,你的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,所以我不喜歡做出毫無根據的假設。
..或者通過調用'malloc()' – Arun 2010-10-12 04:25:48
@ArunSaha:是的,或者讓它指向一個本地char變量。 – codaddict 2010-10-12 04:27:19
爲什麼需要在scanf中的%c之前放一個空格?對我來說,它不工作,如果我刪除scanf中%c之前的空間。 – hunch 2015-08-11 13:50:11