【发布时间】:2017-03-10 10:44:39
【问题描述】:
用户需要输入一个整数,然后输入回车。如果它被验证,那么它应该返回整数,如果没有验证,用户应该得到一个错误消息。
当我尝试通过 getInt() 函数验证输入时,当我输入 1 个或多个字符时会出现无限循环。当我输入abc 时,我得到一个无限循环的错误消息,而输入1a 得到正确的验证(1 条错误消息)。我按照此流程图的指示进行操作:
代码
#include <stdio.h>
void clrKyb(void){
char input;
do {
scanf("%c",&input);
} while(input !='\n');
}
int getInt(void){
char NL= 'x' ;
int value ;
while(NL!='\n'){
scanf("%d%c",&value,&NL);
if(NL!='\n') {
void clrKyb(void);
printf("Invalid integer, please try again:");
}
}
return value ;
}
int main(void) {
int iVal;
printf("Enter an integer: ");
iVal = getInt();
printf("You entered: %d\n", iVal);
return 0;
}
【问题讨论】:
-
在
getInt中,void clrKyb(void);应该只是clrKyb();,因为您想使用您已经定义的clrKyb。 -
请注意,在
clrKyB()(和getInt())中,您需要检查来自scanf()的返回值。如果它返回 EOF,那么任何重试等都不会停止无限循环。 (正如 cxw 所指出的,目前在getInt()中,您(重新)声明clrKyB()并且不要调用它 - 这也是一个问题。) -
谢谢@cxw 和乔纳森·莱夫勒。将 void clrKyb(void) 更改为 clrKyb() 解决了我的问题。我不知道这样的事情会影响无限循环,我想我必须在 scanf 函数中添加一些东西。顺便说一句,我怎样才能通过评论来标记这个答案(我是新来的)。
-
@Jonathan Leffler
-
@elvisi27:在有答案而不是评论之前,没有正式的方式来接受答案。我将从两个有效的 cmets 中创建一个答案。由于这是一项共同努力,我将其设为“CW”(社区 wiki),这意味着 cxw 和我都不会从中获得任何积分,但您将能够接受它(您会获得奖金),并且问题将明显“完成”。
标签: c validation char scanf