输入确认:

假设有一个处理非负数的循环,用户可能犯一类错误是输入一个负数,我们可以用关系表达式来检测这类错误。

int n;

scanf (“%d”,&n);

while (n >= 0)

{

对n的处理过程

scanf (“%d”,&n);

}

另外一个潜在的易犯错误是用户可能输入错误类型值,检测这类错误的一种方式就是检查scanf ()的返回值。对上面代码的改进:

int n;

while (scanf (“%d”,&n) == 1 && n >= 0)

{

对n的处理;

}

从字面上来看,while循环的条件就是“当输入一个整数且整数为正”。

虽然这样可以处理不合法的输入但是不够友好,要输入错了,还要给用户一个尝试输入正确类型的值的机会,如果要这样作的话,首先要剔除那些有问题的输入,如果scanf ()没有成功读取输入,就会将其留在输入的队列中。这时。输入实际上是字符流这一事实就有用了,你可以使用getchar ()来一个一个字符的读取输入,这些方法可以用一个函数来表示:

int get-_int (void)

{

int input;

char ch;

while (scanf (“%d”,&input) != 1)

{

while((ch = getchar()) != ‘\n’)

putchar (ch);

printf (“is not an integer .\nPlease enter an”);

printf (“integer value ,such as 25,-178,or 3:”);

}

return input;

}

这个函数试图将一个int值读入变量input。如果没有成功。则该函数进入外层while循环的语句。然后内层while循环逐个字符地读取那些有问题的输入字符,注意该函数选择丢弃该行中余下的所有输入。你也可以选择只丢弃下一个字符。然后该函数提示用户重新尝试。外层循环继续运行直到用户成功地输入一整数从而使scanf()返回值1.

克服了用户输入整数的障碍后,程序可以检查这些值是否有效。

//8-7.c

#include <stdio.h>

int get_int (void);

bad_limits (int begin,int end,int low,int high);

double sum_squares(int a,int b);

int main (void)

{

const int MIN = -1000;//范围的下界限制

const int MAX = +1000;//范围的上界限制

int start ;

int stop;

double answer;

printf ("This program computes the sum of the squares or"

"integers in a range .\n The lower bound should not "

"be less than - 1000 and \n the upper bound should not"

"be more than + 1000 .\n Enter the limite (enter 0 for "

"both limite to quit ):\n lower limit:");

start = get_int ();

printf("upper limit:");

stop = get_int ();

while (start != 0 || stop != 0)

{

if (bad_limits (start ,stop ,MIN,MAX))

printf ("Please try again .\n");

else

{

answer = sum_squares (start,stop);

printf ("Then sum of the squares of the integers from");

printf ("from %d to %d is %g\n",start, stop ,answer);

}

printf ("Enter the limits (enter 0 for both limits to quit ):\n");

printf ("lower limit:");

start = get_int ();

printf ("upper limit:");

stop = get_int ();

}

printf ("Done.\n");

return 0;

}

int get_int (void)

{

int input;

char ch;

while (scanf ("%d",&input) != 1)

{

while ((ch = getchar ()) != '\n')

putchar (ch);

printf ("is not an integer.\nPlease enter an ");

printf ("integer value ,such as 25,-178,or 3:");

}

return input;

}

double sum_squares (int a,int b)

{

double total = 0;

int i;

for (i = a; i <= b;i++)

total += i*i;

return total;

} bad_limits (int begin,int end,int low ,int high)

{int not_good = 0;

if (begin > end)

{

printf ("%d isn't smaller than %d.\n",begin,end);

not_good = 1 ;

}

if (begin <low || end > high)

{

printf ("Values must be %d or greater.\n",low);

not_good = 1;

}

if (begin > high || end > high)

{

printf ("Values must be %d or lese.\n",high);

not_good = 1;

}

return not_good;

}

程序分析:

我们已经遵循了一种模块化方法,使用独立的函数(模块)来确认输入和管理显示,

main()函数管理流程,为其化函数指派任务。它使用get_int()来获取值,用while来处理这些值,用badlimits()函数来检查值的有效性,sum_sqarer()函数则进行实际的计算。

输入流和数值:

C输入的工作方式.它对输入是用字节流的处理方法来处理输入如:is 28 12.4 C对这一串字符的处理是。第一个字节是字母i的字符编码,第二个字节是字母s的字符编码,第三个字节是空格字符的编码,第四个字节是数字2的字符编码,等等。所以如果get_int()遇到这一行,则下面的代码将读取并丢弃整行,包括数字,因为这些数字只是该行中一字符而已:

while ((ch = getchar())!= ‘\n’)

putchar (ch);

虽然输入流由字符组成,但如果你指示了scanf ()函数,它就可以将这些字符转换成数值,如:输入42

如果你在scanf()中使用%c说明符,该函数将只读取字符4并将其存在一个char类型的变量中。如果使用%s说明符,该函数会读取两个字符,即字符4和字符2,并将其存储在一个字符串中,如果用%d说明符,则scanf()读取同样两个字符,但是随后会断续计算与它们相应的整数值为4*10+2,即42,然后将该数的二进制表示保存在一个int变量中。如果使用%f说明符,则scanf()函数读取这两个字符,计算他们对应的数值42,然后以内部浮点表示该值,并将结果保存在一个float变量中。

简而言之,输入由字符组成,但scanf ()可以将输入转换成整数或浮点值,使用像%d或%f这样的说明符能限制可接受的输入的字符类型,但getchar()和使用%c的scanf ()接受任务字符.