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);

そして、これは実行時の私の出力です:

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

私の質問は、なぜ文字以外を入力すると、「文字を推測する」というメッセージが2回表示されるのですか?

4

2 に答える 2

1

バッファで厄介なことを回避することについて少し提案します.scanfを使用しないでください.fgetsを使用するか、それを使用してバッファをきれいにすることができます.
使い方はマニュアルを読めばわかると思いますが、例を挙げます。

while(letter == 0)
{
    char buffer[10];
    printf("Guess a letter: ");
    fgets(buffer,10,stdin);
    if(strlen(buffer)==2)
        letter = checkLetterCase(buffer[0]);
}
于 2012-12-16T23:35:00.313 に答える
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;
}
于 2012-12-16T23:27:08.987 に答える