2012-12-16 53 views
0

我的功能:雙重要求輸入,如果輸入錯誤給出

//Check Character Case(Upper/Lower Case). If Upper Convert to Lower Case. 
char checkLetterCase(char letter){ 
    if(letter >= 65 && letter <= 90){ 
     letter = tolower(letter); 
     return letter; 
    } 
    else if(letter >= 97 && letter <= 122){ 
     return letter; 
    } 
    else{ 
     return 0; 
    } 
} 

//Add the Specified Letter by Creating a New Node in the Letter List defined 
void addLetter(letterListT *letListHead, char letter){ 
    letterListT *newNode; 
    newNode = (letterListT *)malloc(sizeof(letterListT)); 

    //Check Case(lowe/upper) 
    letter = checkLetterCase(letter); 

    //This may only occur on user input 
    while(letter == 0){ 
     printf("Guess a letter: "); 
     scanf("%c", &letter); 
     letter = checkLetterCase(letter); 
    } 

    newNode->letter = letter; 

    newNode->nxt = letListHead->nxt; 
    letListHead->nxt = newNode; 
} 

我的主要電話:

addLetter(unusedLetList, i=0); 

,這是我outpun上運行:

Guess a letter: 6 
Guess a letter: Guess a letter: t 

和我的問題是:爲什麼當我把一個非字符我得到「猜字母」的消息兩次?

回答

1

因爲在按<enter>之後,還有一個額外的換行符(scanf()還沒有被使用)。做出getchar()通話擺脫的是:

letter = checkLetterCase(letter); 
if (letter == 0) getchar(); 

順便說一句,你checkLetterCase()功能在非ASCII系統打破。使用這個來代替:

#include <ctype.h> 

char checkLetterCase(char letter) 
{ 
    return isalpha(letter) ? letter : 0; 
} 
1

一個小建議如何避免與緩衝器討厭的東西,只是不使用scanf.You可以使用它,並清理緩衝區,你可以用fgets。
我想,你可以學習如何通過閱讀手冊來使用它,但我會讓你一個例子:

while(letter == 0) 
{ 
    char buffer[10]; 
    printf("Guess a letter: "); 
    fgets(buffer,10,stdin); 
    if(strlen(buffer)==2) 
     letter = checkLetterCase(buffer[0]); 
} 
+0

這是真正有用的,但我可以問爲什麼字符緩衝區[]尺寸爲10時,我們最多需要輸入1(char)+1('\ n')?就是想。 –

+0

它可能有一個最小大小爲4.Two的第一個和第二個字符,一個用於'\ n'字符和一個用於終止符。第二個字符用於查看用戶是否輸入了太長的字符串,在這種情況下輸入是錯誤的。 –