如果用户输入更多内容,如何只读取一个字符而忽略其他字符?

时间:2014-03-13 13:52:11

标签: c input character

我有一个项目必须只在C中生成(我不允许使用C ++)。 现在我正在使用UI(在控制台中显示一个小菜单,每个选项都有一个从0到6的数字,用户输入数字,点击输入等等。)

我的阅读选项功能有问题。

起初我试过

int option;
scanf("%d", &option);

但是当我输入字符时,这会导致问题。

我试过读一个字符:

char option;
scanf("%s", &option);
option -= '0'; 

这让我可以像对待一个号码一样对待它并且对第一次测试很有帮助,让我验证选项是否有效(它不是一个字母,它是一个0到6之间的数字)

问题是我可以输入多个字符,所有字符都会存储在内存中。这显然很糟糕。

我尝试使用"%c"进行阅读,但这会显示我输入的字符串中每个字符的错误消息。

为了使它更清楚,这是函数

int readOption(int maxOp)
{
    char option = -1;
    while(option < 0 || option > maxOp)
    {
        scanf("%c", &option);
        option -= '0';
        if(option < 0 || option > maxOp)
            printf("Invalid option!\nTry again: \n");
    }
    return option;
}

如果我输入&#34; abc&#34;,错误信息将被打印3次。

那么如何确保输入的任何额外字符都被忽略?

3 个答案:

答案 0 :(得分:2)

试试这个

int ch;
scanf(" %c", &option);
while((ch = getchar()) != '\n');

答案 1 :(得分:0)

未经测试,买你可以尝试这样的事情:

scanf(" %[0-6]1d*[^\n]", &option);

scanf的调用仅在输入为0到6之间的单个数字时有效,忽略前导空格。 *禁止任何字符不在此范围内且不是换行符。

答案 2 :(得分:0)

您可以使用getc()来完成以下工作:

int main(){
    char choice = getc(stdin);
    fflush(stdin);
}

现在choice是第一个输入的字符,删除第一个字符后输入的所有内容,因此不会打扰其他任何用户输入。

通常,当用户输入输入内容时,它会存储在名为stdin的特殊缓冲区中,如果您在使用fflush(stdin)读取了第一个字符后没有删除该缓冲区,则会中断以后的任何用户输入