C语言健壮性

您所在的位置:网站首页 c语言如何使程序重新运行 C语言健壮性

C语言健壮性

2023-06-05 00:49| 来源: 网络整理| 查看: 265

       为了增强程序的健壮性,有必要的一点就是,你需要对用户输入的不合法的数据进行处理,以防止由于用户的错误操作导致的程序崩溃。

       比如,当你写了一个程序,比如一个简单的计算器(部分如下图,我初学C语言的时候写的),你希望用户每次输入一个计算式,并且为了方便可以多次计算。

但是,如果此时由于用户的错误操作,比如输入了一个字母,程序便会出错。

 

下面从两方面讨论

程序不再等待用户输入的原因解决问题的办法

 

程序不再等待用户输入

为了弄懂这个原因,就要先弄懂两件事:输入缓冲区 和 scanf的读取方式。

scanf的读入方式(以下内容来源于《C primier Plus》第六版)

简单来讲,对于上面的程序,由于开头第一个是%f,并且字母a不能以浮点形式读入,所以程序不再等待用户输入,而是从上次未读入的a开始,但是由于每次都不能读入成功,所以循环会一直进行下去

 输入缓冲区

 

大部分系统在用户按下Enter键之前不会重复打印刚输入的字 符,这种输入形式属于缓冲输入。用户输入的字符被收集并储存在一个被称 为缓冲区(buffer)的临时存储区,按下Enter键后,程序才可使用用户输入的字符。

 

所以对于以上的程序,a一直存在与缓冲区中,要想重新使用户输入,则需要清空输入缓冲区。

解决问题的办法

即清空输入缓冲区。

先来看简单的情况。

与月份有关的输入,应该保证输入的数字大于0且不超过12。如果用户输入负数或者大于12的数字,要提示用户重新输入,这很容易办到,只需要用一个循环就可以了:

对于不合法字符的输入,我们需要利用函数scanf的返回值来判断数据是否成功读入

函数scanf返回的是该函数成功读入的变量的个数,读到文件结尾时返回-1(EOF)。

例如    scanf("%d%d", &a, &b);

当输入   1 2  时,返回 2;

输入       1 a  时,返回 1;

输入       a 2  时,返回 0;

输入       ^Z   时,返回 -1。

类似于A中的思路,当数据未全部成功读入时循环进行,但是同时还要清空缓冲区中的a。

代码如下:

当scanf返回值小于1时,用getchar来获取缓冲区的字符a,并且继续循环,提示用户重新输入。

这样的代码即可以满足要求,当输入不合法时会提示用户重新输入。

关于 fflush() 的使用

很多人可能觉得使用 fflush(stdin); 不就能清空缓冲区了,但使用这种方法有很多不确定性。

(以下内容部分参考自其他博客,原作者看到后可以联系我,我会把链接放在这里)

实际上,C和C++的标准里从来没有定义过 fflush(stdin)。某些编译器支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),因为标准中根本没有定义 fflush(stdin)。

MSDN 文档里 也清楚地写着 fflush on input stream is an extension to the C standard

(fflush 操作输入流是对 C 标准的扩充)。 当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。

所以不建议使用fflush,移植性不是很好,反正上面的方法也不是很麻烦。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3