【发布时间】:2018-01-22 21:03:43
【问题描述】:
我正在尝试在切换之前进行一段时间,以便我确定用户输入将匹配其中一种情况。但我这里有 1 个问题。
如果我给出例如输入“5a”,它仍将使用 5 来执行案例 5。我如何验证它以便用户只能给出确切的数字作为输入?
int move;
char validation[50];
do {
printf("Input must be from 1 to 8:\n");
fgets(validation, sizeof(validation), stdin);
move = atoi(validation);
}
while (move < 1 || move > 8);
switch (move) {
case 1:
dx = -1;
dy = -1;
break;
case 2:
dx = 0;
dy = -1;
break;
case 3:
dx = 1;
dy = -1;
break;
case 4:
dx = 1;
dy = 0;
break;
case 5:
dx = 1;
dy = 1;
break;
case 6:
dx = 0;
dy = 1;
break;
case 7:
dx = -1;
dy = 1;
break;
case 8:
dx = -1;
dy = 0;
break;
}
【问题讨论】:
-
乍一看,您的
while条件毫无意义,显然(move != 1) || (move != 2)始终为真。 -
伙计们谢谢你们的cmets!我现在编辑了它,但仍然遇到第二个问题!
-
虽然条件仍然很差:应该是
while (move < 1 || move > 8);更好的是,设置为while (! isValid(move)),并让该函数执行您想要的所有额外有效性检查。 -
atoi()将尽可能多地解析输入字符串;如果您想检测无效输入,您可能应该使用strtol()并在完成后验证endptr指向字符串的末尾(通过检查*endptr == '\0'很容易检测到)。 -
非常重视this advice。当代码明确说明它的作用时,出现错误就变得非常困难,而当代码太复杂而无法阅读并立即知道它的作用时,它本身就是一个错误。
标签: c validation input case do-while