为了增强程序的健壮性,有必要的一点就是,你需要对用户输入的不合法的数据进行处理,以防止由于用户的错误操作导致的程序崩溃。
比如,当你写了一个程序,比如一个简单的计算器(部分如下图,我初学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
(
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
语言
实验
-
虎子查找指定
字符
的解答。
这个实验要求我们编写一个程序,能够在一个
字符
串中查找指定
字符
,并输出该
字符
在
字符
串中的位置。
具体实现方法可以使用循环遍历
字符
串,逐个比较
字符
,找到指定
字符
后输出其位置即可。
希望我的回答能够帮助到您,如有任何疑问,请随时联系我。