C 如果用户键入更多字符,我如何只读取一个字符而忽略其他字符?

C 如果用户键入更多字符,我如何只读取一个字符而忽略其他字符?,c,input,character,C,Input,Character,我有一个项目,必须只用C(我不允许使用C++)。 现在我正在处理UI(控制台中显示的一个小菜单,每个选项都有一个从0到6的数字,用户键入数字,点击回车键等等) 我的阅读选项功能有问题 起初我试过了 int option; scanf("%d", &option); 但当我输入字符时,这就造成了问题 我试着读一个字符: char option; scanf("%s", &option); option -= '0'; 这使我能够将其视为一个数字,并且在第一次测试中效果良好,允

我有一个项目,必须只用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;
}
int-readOption(int-maxOp)
{
char选项=-1;
while(选项<0 | |选项>maxOp)
{
scanf(“%c”和选项(&O);
选项-='0';
如果(选项<0 | |选项>最大值)
printf(“无效选项!\n请重试:\n”);
}
返回选项;
}
如果我键入“
abc
”,错误消息将打印3次

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

试试这个

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

未经测试,请购买您可以尝试以下内容:

scanf(" %[0-6]1d*[^\n]", &option);
int main(){
    char choice = getc(stdin);
    fflush(stdin);
}
只有当输入为0到6之间的单个数字时,调用scanf才有效,忽略前导空格
*
抑制不在此范围内且不是换行符的任何字符。

您可以使用
getc()
执行以下操作:

scanf(" %[0-6]1d*[^\n]", &option);
int main(){
    char choice = getc(stdin);
    fflush(stdin);
}
现在,
choice
是第一个输入的字符,在第一个字符之后输入的所有内容都将被删除,因此不会中断任何其他用户输入


一般来说,当用户输入时,它存储在一个名为
stdin
的特殊缓冲区中,如果您在使用
fflush(stdin)
读取第一个字符后不删除该缓冲区,它将中断任何未来的用户输入。

我从来不知道scanf可以与正则表达式一起工作。这不起作用(奇怪的是,它导致了无限循环的“无效选项!”),但这将在其他方面帮助我:)我将尝试进一步探讨这一点,也许它会起作用。@user3002428实际上,
scanf
不适用于“标准”正则表达式,它有自己的语法;不过,我确信解决方案应该接近我提出的方案(我将尝试并实际测试它)!这几乎解决了所有问题。它有一个小缺点:如果我输入“1a”,它将被视为选项1,但我认为如果我忽略额外的字符,这就是我得到的结果。谢谢:)我很高兴它帮助了你:)