c - 用户输入限制失控

标签 c validation input

int problem;

printf("Please select the problem that you want to solve:\n");
printf("\t 1-Problem 1\n");
printf("\t 2-Problem 2\n");
printf("\t 3-Problem 3\n");

while( scanf("%d", &problem)==0 && (problem!=1 || problem !=3 || problem !=2))
{
  int c;
  while((c=getchar())!='\n' && c!=EOF);
  printf("Please select the problem that you want to solve:\n");
  printf("\t 1-Problem 1\n");
  printf("\t 2-Problem 2\n");
  printf("\t 3-Problem 3\n");
}

由于有多个 printf,它看起来有点困惑。我只是不想在一行中出现冗长的代码。不管怎样,我只想要 1,2 或 3 作为输入。如果输入的内容无效,程序会再次询问用户,直到用户输入有效的内容。

当然,该代码适用于字符、字符串输入,但每当 0 或任何其他整数或以除 1,2 和 3 之外的数字开头的输入时,程序不执行任何操作。另外,如果输入 1.2,则选择 1。 2.2 也是如此,2.3 将变成 2。我该如何修复它?

最佳答案

第 1 点

你需要改变涉及的逻辑

scanf("%d", &problem)==0

因为,如果scanf()返回0,那么读取问题undefined behaviour .

您需要重新考虑 while 循环逻辑。另外,始终初始化局部变量。

第2点

你需要改变

(problem!=1 || problem !=3 || problem !=2)

((problem!=1) && (problem !=3) && (problem !=2))

因为,从逻辑上讲,您试图说,如果输入不是 1、不是 2、也不是 3,那么...,所以,

关于c - 用户输入限制失控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29673371/

相关文章:

c - Linux UDP 套接字/端口重用

c - 单链表中current->link->data和current->data有什么区别?

c - 使用 opencv 在相机上线程化face_detection

c# - 必需的验证属性和自定义验证器顺序

.net - 单击菜单项时验证 DataGridView

c - 输入的数字大于 int 类型允许的数字

php - Zend Framework 2 - 整数形式验证

python - 从文件中读取 I/O (python)

c++ - 疯狂计算器

c++ - 从文本文件中读取整数