在实际应用中,用户不一定会按照程序的指令行事。
用户的输入和程序期望的输入不匹配时常发生,这会导致程序运行失败。作为程序员,除了完成编程的本职工作,还要事先预料一些可能的输入错误,这样才能编写出能检测并处理这些问题的程序。例如,假设我们编写了一个处理非负数整数的循环,但是用户很可能输入一个负数。
你可以使用关系表达式来排除这种情况:
long n;scanf("%ld", &n); // get first valuewhile (n >= 0) // detect out-of-range value{ // process n scanf("%ld", &n); // get next value}
另一类潜在的陷阱是,用户可能输入错误类型的值,如字符q。排除这种情况的一种方法是,检查scanf()的返回值。回忆一下,scanf()返回成功读取项的个数。因此,下面的表达式当且仅当用户输入一个整数时才为真:
scanf("%ld", &n) == 1
结合上面的while循环,可改进为:
long n;while (scanf("%ld", &n) == 1 && n >= 0){ // process n}
while循环条件可以描述为“当输入是一个整数且该整数为正时”。
对于最后的例子,当用户输入错误类型的值时,程序结束。
然而,也可以让程序友好些,提示用户再次输入正确类型的值。在这种情况下,要处理有问题的输入。如果scanf()没有成功读取,就会将其留在输入队列中。这里要明确,输入实际上是字符流。可以使用getchar()函数逐字符地读取输入,甚至可以把这些想法都结合在一个函数中,如下所示:
long get_long(void){ long input; char ch; while (scanf("%ld", &input) != 1) { while ((ch = getchar()) != '') putchar(ch); // dispose of bad input printf(" is not an integer.nPlease enter an "); printf("integer value, such as 25, -178, or 3: "); } return input;}
该函数要把一个long类型的值读入变量input中。如果读取失败,函