gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:57:13 25 4
gpt4 key购买 nike

我在理解如何让我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com