C语言 C99标准与C11标准部分更改函数对比
文章目录
1. scanf 函数与scanf_s 函数
1.1 scanf函数
- 函数原型:int scanf(const char *format, …);
- 输入格式:scanf(“输入控制符”, 输入参数);
- 功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。
1.2 scanf_s函数
- 函数原型:暂时不知道,知道的朋友麻烦告诉一下
- 输入格式:scanf(“输入控制符”, 输入参数,n);(scanf_s最后一个参数是缓冲区的大小,表示最多读取n-1个字符.)
1.3 两者区别
-
scanf 不会检查输入边界,可能造成数据溢出。
-
scanf_s 会进行边界检查。
1.4 注意事项
- 通常使用格式 %s 时才有必要加上长度n
- 使用 %d 格式时会有“格式字符串中传递的参数太多”的警告
2. gets 函数与gets_s 函数
2.1 gets函数
-
函数原型:char *gets(char *str);
-
参数说明:类型为 char* 型,即 str 可以是一个字符指针变量名,也可以是一个字符数组名。
-
说明:从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保str的空间足够大,以便在执行读操作时不发生溢出。
2.2 gets_s 函数
- 函数原型:char *gets(char *str,size);
- 用法:gets_s(str,size);
2.3 两者区别
- gets 可以无限读取,易发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。
- gets_s 读取size长度字符,遇到回车则提前结束读取。
2.4 注意事项
- 暂无发现:2020年2月3日18:08:14
3. fopen 函数与fopen_s 函数
3.1 fopen 函数
- 作用:打开一个文件
- 调用的一般形式为:文件指针名=fopen(“文件名”,“使用文件方式”);
- ”文件指针名”必须是被声明为FILE 类型的指针变量;
- “文件名”是被打开文件的文件名;
- “使用文件方式”是指文件的类型和操作要求;
- “文件名”是C风格字符串。
- 例子
FILE *fileOpenPointer;
fileOpenPointer=fopen("123.txt","w");
fclose(fileOpenPointer);
3.2 fopen_s 函数
- 函数原型:errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );
- pFile:文件指针将接收到打开的文件指针指向的指针
- infilename:文件名
- inmode:允许的访问类型。
- 返回值:如果成功返回0,失败嘛…那玩意太多了,建议上网查找一下。。。
- 例子
//须定义另外一个变量errno_t err
errno_t err;
FILE *fileOpenPointer;
err = fopen_s(fileOpenPointer,"123.txt","w");
3.3 两者区别
- fopen_s 比 fopen 多出了“溢出检测”。
- fopen_s 的返回值不是文件指针,而是相应的错误代码,此改进有助于排查、更正错误。
3.4 注意事项
- fopen_s 打开的文件不能共享。如果你打开的文件是共享文件或者是该文件需要共享,则考虑使用 _fsopen 函数与 _wfsopen 函数
待完善…
本人撰写博客纯粹为记录自己在学习过程的遇到的困难、问题的解决办法。如有错误,请大家不吝指教!谢谢!