【C】将m~n之间的素数输出与VS2005以上版本对C语言的scanf的警告warning C4996

素数也叫质数,就是在大于1的自然数中,除了1和此整数自身外,不能被其他不包括0的自然数所整除的数,

需要注意的是,判断一个自然数n是否为质数,无须从1-n检验是否都能与此数整数,只需要用少于等于根号n的所有素数与此数试除即可,这样,每个数的检验的时间复杂度,足足减少了一半。

C语言的实现代码如下:

#include<stdio.h>
#include<math.h>
void main(){
	int m,n;
	printf("输出从m到n的素数:\n");
	printf("m=");
	scanf("%d",&m);
	printf("n=");
	scanf("%d",&n);

	for(int i=m;i<=n;i++){
		int flag=1;//使用flag来控制这个素数是否输出而不是直接pass掉这个素数
		for(int j=2;j<=sqrt(float(i));j++){
			if((i%j)==0){
				flag=0;
				break;
			}
		}
		if(flag){
			printf("%d,",i);
		}
	}
}
运行结果如下:


如果在VS2005以上的版本可能会出现scanf的警告,warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details

在Windows环境下,不推荐用ANSI字符串类型,已经废止printf()系列函数,改用后面带_s的函数形式,采用unicode字符串。用scanf()函数接收的字符串,将有可能出错,ANSI是用0结束的字符串,但unicode字符串有些字符的第二位是0,这样scanf()就只收到0之前的那一串代码。现在的Windows,内部全部使用unicode字符串进行处理,如果你的程序强行采用ANSI字符串形式,则Windows会多做一个动作,将这些字符串转换为unicode码,在返还给你的程序时,若用printf(),又要再转回ANSI码。新型的C编译程序给出这个警告,是有道理的。一般警告类信息,可以不理睬而强行编译,也能通过,但不保证执行正常。

ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内在泄露。所以vc++2005/2008中提供了scanf_s(),在调用时,必须提供一个数字以表明最多读取多少位字符。

这是ide的安全检查,和c语言本身没关系。scanf_s()的使用如下:

#include <stdio.h>
#include <stdafx.h>

int main()
{
	int a,b,sum;
	printf("请输入两个整数\n");
	scanf_s("%d,%d",&a,1,&b,1);
	sum=a+b;
	printf("%d",sum);
	return 0;
}


  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值