用scanf_s判断输入数据是否合法

用scanf_s判断输入数据是否合法

1.0版本

写一个程序,对用户输入的整数进行求和。当用户输入任意字符时,结束程序并打印结果。
程序实现如下:

image

scanf_s函数会返回成功接收字符的个数,所以我们只需检查每次调用 scanf_s函数的返回值是否为 1 即可。

代码实现:

#include <iostream>
#include<cstdio>

int main()
{
        int num = 0;
        long sum = 0L; // 0L表示类型为long的0
        int status;

        do
        {
                cout<<"请输入合法的数字:;
                sum = sum + num;
                status = scanf("%d", &num);
        } while(status == 1);

        printf("结果是:%ld\n", sum);
        system("pause");
        return 0;
}

2.0版本

为上一题的数字求和程序写一个 2.0 版本,请实现以下要求:
A. 用户可以输入整数和浮点数
B. 用户可以在同一行输入多个数字,数字之间可以是任意一个分隔符(如下图)
C. 结果保留两位小数
程序实现如下图:
image
答:要求 A 不难实现,统一将用户输入的数转换为浮点型即可(整数到浮点型的转换是无损的);要求 B 则需要我们检测用户是输入了数字之后是否按下了回车(检测是否存在换行符)。因此,我们需要嵌套一个内循环来处理那些一行包含多组数字的情况。

代码实现:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	float num = 0;
	double sum = 0;
	int status;
	do
	{
		cout << "请输入合法的数字:";
		do
		{
		sum += num;
		status = scanf_s("%f", &num);
		}
		while (getchar() != '\n'&& status == 1);//只有输入不为回车且scanf_s函数只接收到一个字符时,才会进行内层循环;当输入回车时,根据短路求值原理,后面语句将不再做判断;当输入空格或其他字符时继续循环
	}
	while (status == 1);//当输入其他字符时,退出循环,只有输入数字时,外层循环才会继续。
	printf("结果是:%.2lf\n", sum);


	system("pause");
	return 0;
}

更多c++代码小技巧和经典代码请点击这里

posted @ 2021-05-16 10:31  Stéphane  阅读(418)  评论(0)    收藏  举报