【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);
		}
	}
}
运行结果如下:

【C】将m~n之间的素数输出与VS2005以上版本对C语言的scanf的警告warning C4996_第1张图片

如果在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;
}


你可能感兴趣的:(算法,素数,C语言,scanf,警告)