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 函数

待完善…

	本人撰写博客纯粹为记录自己在学习过程的遇到的困难、问题的解决办法。如有错误,请大家不吝指教!谢谢!
发布了21 篇原创文章 · 获赞 2 · 访问量 1601

猜你喜欢

转载自blog.csdn.net/tothk/article/details/104159425
今日推荐