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

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

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

下面从两方面讨论

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

为了弄懂这个原因,就要先弄懂两件事: 输入缓冲区 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 ,移植性不是很好,反正上面的方法也不是很麻烦。

为了增强程序的健壮性,有必要的一点就是,你需要对用户输入的不合法的数据进行处理,以防止由于用户的错误操作导致的程序崩溃。 比如,当你写了一个程序,比如一个简单的计算器(部分如下图),你希望用户每次输入一个计算式,并且为了方便可以多次计算。但是,如果此时由于用户的错误操作,比如输入了一个字母,程序便会出错。下面从两方面讨论程序不再等待用户输入的原因 解决问题的办法程序不再等待用户输入为了弄懂这个原因,就要先弄懂两件事:输入缓冲区 和 s...
【问题描述】 编写一个程序,要求 用户 输入 一个两位数,然后输出显示该数的英文单词。 提示 :把数分解为两个数字。用一个switch语句显示第一位数字对应的单词(“twenty”、“thirty”等),用第二个switch语句显示第二位数字对应的单词。不要忘记11~19需要特殊处理。 【 输入 形式】 一个十进制两位整数 【输出形式】 输入 的整数所对应的英文单词(所含字母均小写) 【样例 输入 】 【样例输出】 eighty - five 【样例说明】 【评分标准】 while((n=scanf("%d%d",&a,&b))!=2){ printf("error,scanf return %d\n",n); while(getchar()!='\n'); printf("%d,%d",a,b); 这里有两层while循环,第一层用于检测scanf的返回值
大整数乘法和我们小学学过的乘法公式一样(如下图),就是按位相乘,两个数中的每一位彼此相乘,然后将相同列的结果加起来,最后统一处理进位即可。#include <iostream> #include <cstring> using namespace std; #define MAX_N 1000 void mul(int *num1, int *num2, int *re...
# str_num = input('input a number:') # num=float(str_num) # print(num) # break #若 输入 的正确,则退出,错误执行except下面代码...
1.乘法规律,一个数的第i位和另一个数的第j位相乘,一定会累加到结果的第i+j位,结果的数组一个数组元素存2位数,最后对结果处理进位,最后打印出来。 注:相乘后的位数k不会超过m+n。 乘法计算步骤如下: a数组存一个数,b数组存一个数,按位相乘后放入c数组中。 C 语言 代码:(时间复杂度为小于O(n²),分治法,错位相加) #include<stdio.h> #include<math.h> #include<string.h> #define M 10000 大整数乘法,就是乘法的两个乘数比较大,最后结果超过了整形甚至长整形的最大范围,此时如果需要得到精确地结果,常规的乘法就不能得到正确的结果了。此时需要算法思想了,对,就是分治算法,将乘数“分割“,将大整数计算转换为小整数计算。 咱先来个小点的数乘法,然后逐步找出大数乘法的解法: 1、 一位乘法就是乘法口诀,没什么可说的。 2、 说说2位乘法    12*23 = 408 分割成一位
大整数乘法 ——无限大整数问题描述解法通常算法分治法代码结果测试 基于分治思想设计一个大整数乘法的实现程序,可以进行两个大整数的乘法运算,要求时间复杂度小于 O(n2)。 【 输入 】 分行 输入 两个大整数,两个整数的长度可以不相同,如果 输入 的不是合法的 整数,应 提示 重新 输入 。 【输出】 计算输出两个大整数的乘法结果。 个人在解的时候参考了很多大神的资料,链接如下: https://blog.csdn.net/BigData_Mining/article/details/102884892. 您好,我可以为您提供关于7 - 9 sdut - c 语言 实验 - 虎子查找指定 字符 的解答。 这个实验要求我们编写一个程序,能够在一个 字符 串中查找指定 字符 ,并输出该 字符 字符 串中的位置。 具体实现方法可以使用循环遍历 字符 串,逐个比较 字符 ,找到指定 字符 后输出其位置即可。 希望我的回答能够帮助到您,如有任何疑问,请随时联系我。