使用更安全的输入函数

新标准–C11标准
运行以下代码:

#include <Windows.h>
#include <iostream>
#include <string>

using namespace std;

int main(void){
	int age;
	double s;
	char ch;
	char line[20];
	scanf("%d %lf %c %s",&age,&s,&ch,line);
	printf("%d %.2f %c %s",age,s,ch,line);
	system("pause");
	return 0;
}

如果你用的是比较新的Visual Studio这段代码将过不了编译,其他IDE至少是警告,错误提示:
在这里插入图片描述
为什么会这样呢?因为现在用的是新的c语言标准–C11标准,在新的标准中,像scanf()、gets()这类函数被认为是不安全的,因为有时黑客可以利用原版函数的不安全性黑掉系统,应该用更安全的函数scanf_s()、gets_s()替代,在有些编译器中只会报警告,而在一些编译器中过不了编译.
将上述代码改为:

#include <Windows.h>
#include <iostream>
#include <string>

using namespace std;

int main(void){
	int age;
	double s;
	char ch;
	char line[20];
	scanf_s("%d %lf %c %s",&age,&s,&ch,sizeof(ch),line,sizeof(line));
	printf("%d %.2f %c %s",age,s,ch,line);
	system("pause");
	return 0;
}

从上面的代码应该可以看出一些端倪,事实上,像上述代码中的变量ch是可以接收大于一个字节的字符的,但是ch中只会存第一个字符,后面的字符将会存在ch后面几个地址中,而那些地址中的数据是可改变的?不可改变的?还是其他变量申请的空间?改变会带来什么意想不到的结果就未可知了.新的函数带上变量的大小能避免输入的时候溢出,见下图结果:
在这里插入图片描述
在以后写代码的时候,不建议再使用这类不安全的函数,关于更多c11的新特性,移步百度百科:https://baike.baidu.com/item/C11/3245086?fr=aladdin

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值