【问题标题】:How can I read only one character and ignore the others if the users types more?如果用户键入更多,我如何只阅读一个字符而忽略其他字符?
【发布时间】:2014-03-13 13:52:10
【问题描述】:

我有一个只能用 C 语言制作的项目(我不允许使用 C++)。 现在我正在处理 UI(控制台中显示了一个小菜单,每个选项都有一个从 0 到 6 的数字,用户输入数字,按 Enter 等等)。

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

一开始我试过

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

如果我输入“abc”,错误信息将被打印 3 次。

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

【问题讨论】:

    标签: c input character


    【解决方案1】:

    试试这个

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

    【讨论】:

    • 这几乎解决了所有问题。它有一个小缺点:如果我输入“1a”,它将计为选项 1,但我认为如果我忽略多余的字符,我会得到这样的结果。谢谢:)
    • 很高兴它帮助了你:)
    【解决方案2】:

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

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

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

    【讨论】:

    • 我从来不知道 scanf 可以使用正则表达式。这没有用(奇怪的是,它导致了“无效选项!”的无限循环),但这将在其他领域帮助我:) 我将尝试更多地探索这个,也许它会起作用。
    • @user3002428 实际上,scanf 不适用于“标准”正则表达式,它有自己的语法;不过,我确信解决方案应该接近我提出的建议(我将尝试并实际测试它)!
    【解决方案3】:

    您可以使用getc() 来完成这样的工作:

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

    现在choice 是第一个输入的字符,在第一个字符之后输入的所有内容都将被删除,因此不会中断任何其他用户输入。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多