【发布时间】:2015-03-23 17:00:52
【问题描述】:
我正在编写一个输入例程,它向用户请求一个介于 1 和 30 之间的数字,这意味着发出错误消息并重新提示用户输入,直到收到有效输入。我使用循环来读取输入并针对各种情况进行检查,一旦收到适当的输入就退出循环。
检查数字是否在范围内的情况(或确实有效)非常好,但是当我检查以确保用户没有输入任何非数字的内容时,整个事情在我的脸上几乎爆炸了,并且循环似乎表现得很奇怪。起初我被告知这是不关闭输入缓冲区的问题,所以我添加了该修复程序,但是尽管第一次满足条件,但它不会跳回循环的前面以允许更改输入-- 相反,它会立即跳转到一个分支,并按顺序或每秒数千次不断地打印该消息。
下面是代码。不断打印的部分是if( isalpha(uNum) ){...。对于我的代码的此版本,将输入置于 30 以上和 1 以下工作正常,但输入“abc”之类的内容会不断打印超过 30 的消息(即“值必须最多为 30...”)。当我取出清除缓冲区的语句 (while(getchar() != '\n');) 时,上述消息不断地被垃圾邮件发送。有人可以帮我解释为什么会这样和/或我需要做些什么来解决它吗?
int get_seed(void)
{
int uNum;
printf("Please enter an integer between 1 and 30:\n");
while(1) {
scanf("%d",&uNum);
while(getchar() != '\n');
if( isalpha(uNum) ){
printf("Your entry must start with a digit; try again\n");
}
else if( (uNum < 1) || (uNum > 30) ){
if(uNum<1){
printf("Value must be at least one; try again\n");
} else {
printf("Value must be at most 30; try again\n");
}
continue;
}
else
break;
}
return uNum;
}
此时我想知道简单地更改“else break;”是否更有意义。语句(这意味着输入是好的)具有 =1 的复合条件,以便新的 else 语句负责第一个 if 应该做什么。
【问题讨论】:
-
scanf()可能会失败添加检查并且您的许多问题都会得到解答 -
scanf() 会失败是什么意思?我不明白这需要什么样的检查。
-
if(scanf("%d",&uNum) == 1){ // Scanf 成功 } -
好的,但是从那里继续我将如何检查非数字输入,因为这是项目的要求之一?具体来说,我们必须在适当的位置打印“您的条目必须以数字开头....”的消息
-
isalpha(int n)很可能没有做你想做的事。scanf()已经尝试转换为整数,但可能失败了,流指向的第一个字符不能是整数的一部分。你真的应该检查scanf()是否成功。您的while循环会很高兴地丢弃所有内容,甚至是有效的整数字符,直到换行符...可能还有其他一些东西...其中一些会通过打开编译器警告并注意它们来捕获...
标签: c loops if-statement input verification