新标准–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