c - 如果您以字符串格式输入无效选择,程序不会要求输入新条目

标签 c

我在理解如何让我的 while 循环简单地输出一条消息说“无效输入”并向用户询问一个新问题时遇到问题,除非他选择数字 1 2 在列表中。例如,如果您输入:asdas 而不是整数,程序将永远不会停止循环,会发生什么。

我希望程序告诉用户从 1-2 输入一个新数字,而不是简单地停止运行,我可以通过将开关中的默认值设置为exit(0);runSystem = false;

例如:

CMD 表示输入 1-2 用户输入:asdaf(永不停止循环),如当前情况。

我想要的是:asdf 然后它说“输入一个新的选择”并等待正确答案。

令我困扰的是,如果您输入一个无效数字,例如:12312312 并要求输入一个新条目,但它不适用于字符串,程序将按照我的意愿执行输入。

代码:

#include <stdio.h>
#include <stdbool.h>

int main(int argc, char **argv) {

    int userinput;
    int runSystem = true;

    void options() {
        printf("<========Welcome to the program, please make a choice========> \n\n");

        printf("1: Say Hello\n");
        printf("2: Say GoodBye\n");
        printf("Please enter a choice:");
        scanf("%d", &userinput);
    }

    while (runSystem) { 
        options();  
        switch(userinput) {         
           case 1: printf("Hello!\n");
           break;           
           case 2: printf("GoodBye!\n");
           break;       
           case 3: printf("Invalid, try again\n");
           break;       
           default: 
           break;       
        }
    }
    return 0;
}

最佳答案

scanf("%d", &userinput); 需要一个 int 作为输入。当您提供非整数时,scanf() 不会将其分配给 userinput

检查scanf()的返回值看看它是否成功。它返回它所做的成功分配的数量。

当您提供一个字符串作为输入时,scanf() 不会接受它并将它留在输入缓冲区中未被使用。

当您再次执行 scanf() 时,无效输入仍然存在于输入缓冲区中,这就是第二个 scanf() 尝试读取的内容。同样的事情发生了,而且还在继续。这就是无限循环背后的原因。

要解决这个问题,您应该在案例 3 中显示消息后使用输入缓冲区中的无效输入。做类似的事情

int ch;
while( (ch=getchar())!='\n' && ch!=EOF );

这将从输入缓冲区消耗直到遇到 \ngetchar()失败时返回 EOF

编辑:标准 C 不允许嵌套函数定义。您没有收到错误的原因可能是因为您的编译器允许将其作为扩展。但它可能不适用于其他编译器。

参见 thisthis .

您可以将 options() 的定义放在调用它的 while 循环中,或者获取 userinput 的值作为返回值,或者通过指向传递给函数的变量的指针。

关于c - 如果您以字符串格式输入无效选择,程序不会要求输入新条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49209692/

相关文章:

c - 在C中按计数属性对链表结构进行排序(在Ubuntu中通过文本文件读入)

c - 为什么我的数组中的值不安全?

c - 将指向 char 数组的指针传递给函数

c - 如何在宏中将可变参数与 printf 一起使用?

c - ACM 丢球

c - Matlab 到 C 的移植

c++ - 如何在 Linux 中使用它的相对路径打开文件?

过滤execve环境的正确方法

c - 对每个数组进行处理

c - OpenGl 中的 glColor3f 亮度很小