如果给出错误输入,请求输入

时间:2012-12-16 23:22:36

标签: c list case-sensitive

我的职能:

//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 个答案:

答案 0 :(得分:1)

因为在按<enter>之后,scanf()还有一个额外的换行符未被({1}}消耗。拨打getchar()来解决这个问题:

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

顺便说一句,你的checkLetterCase()函数在非ASCII系统上被破坏了。请改用:

#include <ctype.h>

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

答案 1 :(得分: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]);
}