8.6 输入验证
在实际应用中,用户不一定按照程序的指令形式。因此,作为程序员,除了完成编程的本职工作,还要实现预料一些可能的输入错误,这样才能写出能检测并处理这些问题的程序。
处理非负整数的循环,但是用户很可能输入一个负数。你可以使用关系表达式来排除这种情况:
long n; //获取第1个值
scanf( "%ld", &n ); //检测不在范围内的值
while( n >= 0 ){
//处理n
scanf( "%ld", &n ); //获取下一个值
}
另一个潜在的陷阱是,用户可能输入错误类型的值,如字符q。排除这种情况的一种方法是,检查scanf()的返回值。scanf()返回成功读取项的个数。因此,下面的表达式当且仅当用户输入一个整数时才为真:
scanf( "%ld", &n ) == 1
结合上面的while循环,可改进为:
long n; //获取第1个值
while( scanf( "%ld", &n ) == 1 && n >= 0 ){
//处理n
scanf( "%ld", &n ); //获取下一个值
}
while循环条件可以描述为“当输入是一个整数且该整数为正时”。
对于最后的例子,当用户输入错误类型的值时,程序结束。然后,也可以让程序友好些,提示用户再次输入正确类型的值。在这种情况下,要处理有问题的输入。如果scanf()没有成功读取,就会将其留在输入队列中。这里要明确,输入起始是字符流。可以使用getchar()函数逐字符地读取输入,甚至可以把这些想法都结合在一个函数中,如下所示:
long get_long( void ){
long input;
char ch;
while( scanf( "%ld", &input) != 1 ){
while( (ch = getchar()) != '\n' ){
putchar( ch ); //处理错误的输入
}
printf( " is not