gpt4 book ai didi

c - 为什么这个无效的输入仍然有效? (切换大小写)字符错误

转载 作者:行者123 更新时间:2023-11-30 21:30:22 25 4
gpt4 key购买 nike

更新的代码

为什么输入12有效?它将 12 解释为选项 1,并为 case'1' 的第一个 scanf 取 2?我不想使用 int opcao ,因为如果我输入一个字母,它将无限期地运行。

我希望用户只能在选择退出选项(其中一种情况)时退出程序,因此执行... while。如果用户输入无效字符或字母或菜单再次显示的内容并显示默认消息。我还希望在执行所选案例后,它再次显示菜单以供新选择,因此我同时使用始终有效的条件 1=1。我不能使用整数,就像你输入一个字母一样,程序会变得疯狂,又名永远不会停止运行。试试吧。

char opcao;



do {
menu();
scanf(" %c",&opcao);

switch(opcao) {
case '1':
printf("Massa do módulo (sem combustível):\n");
scanf("%f",&m_modulo);
printf("Massa de combustível:\n");
scanf("%f",&m_combustivel);
printf("Altitude no início da alunagem em relação a um ponto de referência:\n");
break;
case '2':

break;
case '3':
printf("Funcionalidade nao disponivel.\n");
break;
case '4':
printf("Funcionalidade nao disponivel.\n");
break;
case '5':
printf("Funcionalidade nao disponivel.\n");
break;
case '6':
exit(0);
break;
default:
printf("Opcao invalida, as seguintes opcoes estao disponiveis:\n");
break;
}
}
while(1==1);

最佳答案

这是因为您正在使用单个 %c 读取输入。

这样,12 (1) 的第一个字符由 switch 使用,而第二个字符由 case '1': 的 scanf 使用。

为了避免这种行为,您可以将选项读取为整数,并在第一个 scanf 中使用占位符 %d

<小时/>

编辑:

为了避免无限循环问题,您可以这样做:

#include <stdio.h>

void clean_stdin();

int main() {
int opcao;
float m_modulo, m_combustivel;
int flag = 0;

do {
printf("Make a choice: ");
if (scanf("%d", &opcao) == 0) {
clean_stdin();
}
else {
switch(opcao) {
case 1:
printf("Massa do módulo (sem combustível): ");
scanf("%f", &m_modulo);
printf("Massa de combustível: ");
scanf("%f", &m_combustivel);
printf("Altitude no início da alunagem em relação a um ponto de referência.\n");
break;
case 2:

break;
case 3:
printf("Funcionalidade nao disponivel.\n");
break;
case 4:
printf("Funcionalidade nao disponivel.\n");
break;
case 5:
printf("Funcionalidade nao disponivel.\n");
break;
case 6:
flag = 1;
break;
default:
printf("Opcao invalida, as seguintes opcoes estao disponiveis:\n");
}
}

} while(flag == 0);
}

void clean_stdin()
{
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}

我所做的如下:

  • 检查 scanf 输出是否正确读取输入(在本例中,如果输入是数字,则返回非 0 的数字)。
  • 使用函数 clean_stdin ( Credits ) 清理 scanf 读取但未使用的字符(它需要一个数字,然后给它一个字符,因此该字符保留在 stdin 中并创建无限循环)
  • 我使用一个标志来控制循环条件,当选择退出选项时,标志值将更改为使条件失败的值
  • 我添加了 main() 因为我需要它来运行程序;您可以将里面的内容合并到您的 main 中。请记住复制 clean_stdin() 函数。

我建议你读一些scanf documentation了解其返回值。

我还建议阅读 scanf 替代方案,因为它是一个无聊的函数:link 1link2 .

请记住使用正确的缩进来格式化代码,这是最佳实践。

关于c - 为什么这个无效的输入仍然有效? (切换大小写)字符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26551089/

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