C语言健壮性 |
您所在的位置:网站首页 › c语言如何使程序重新运行 › C语言健壮性 |
为了增强程序的健壮性,有必要的一点就是,你需要对用户输入的不合法的数据进行处理,以防止由于用户的错误操作导致的程序崩溃。 比如,当你写了一个程序,比如一个简单的计算器(部分如下图,我初学C语言的时候写的),你希望用户每次输入一个计算式,并且为了方便可以多次计算。 但是,如果此时由于用户的错误操作,比如输入了一个字母,程序便会出错。
下面从两方面讨论 程序不再等待用户输入的原因解决问题的办法程序不再等待用户输入 为了弄懂这个原因,就要先弄懂两件事:输入缓冲区 和 scanf的读取方式。 scanf的读入方式(以下内容来源于《C primier Plus》第六版)简单来讲,对于上面的程序,由于开头第一个是%f,并且字母a不能以浮点形式读入,所以程序不再等待用户输入,而是从上次未读入的a开始,但是由于每次都不能读入成功,所以循环会一直进行下去 输入缓冲区
大部分系统在用户按下Enter键之前不会重复打印刚输入的字 符,这种输入形式属于缓冲输入。用户输入的字符被收集并储存在一个被称 为缓冲区(buffer)的临时存储区,按下Enter键后,程序才可使用用户输入的字符。
所以对于以上的程序,a一直存在与缓冲区中,要想重新使用户输入,则需要清空输入缓冲区。 解决问题的办法即清空输入缓冲区。 先来看简单的情况。与月份有关的输入,应该保证输入的数字大于0且不超过12。如果用户输入负数或者大于12的数字,要提示用户重新输入,这很容易办到,只需要用一个循环就可以了: 函数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 |