9-9 C11 安全版本的函数

本文介绍了C11标准中引入的安全字符串函数strcpy_s和strcat_s,它们增强了原有函数的安全性。通过error_t类型的返回值和错误处理,我们学习了如何检查并处理拷贝过程中的错误。同时,文章强调了在使用这些安全函数前需要检查编译器支持情况。
摘要由CSDN通过智能技术生成

1. str 系列的安全函数

        例如,strcpy() 的安全函数是 strcpy_s(),strcat() 的安全函数是 strcat_s()。安全函数与原函数相比,函数原型发生了改变。如下图所示,安全函数的返回值是 error_t 类型,而并非原函数的 char* 类型。

         error_t 本质上是 int,不同数值代表不同错误种类。如果是 0,代表程序运行正常;如果非 0,则代表程序运行错误,可以利用 perror 查看错误种类。代码如下:可以发现 error 值为 34,说明程序运行失败,错误原因为 result too large,即待拷贝的字符串过大。

void TestPerror(){

  char des[2];

  // 第一个参数为目标字符串,第二个参数为目标字符串的容量,第三个参数是待拷贝的字符串
  int error_no = strcpy_s(des, 2, "Hello");

  printf("error: %d\n", error_no);

  if(error_no){  // 程序运行不成功,error_no 非 0
    perror("strcpy_s returns:");
  }

}

 2. 安全函数的使用限制

        并非每种编译器都支持安全函数,所以在使用安全函数前,需要利用宏判断当前编译器是否支持。代码如下,如果编译器支持安全函数,则编译器内部一定定义了宏 __STDC_WANT_LIB_EXT1__,会输出 "support C11 safe version.",此时安全函数才可使用。如果不支持,安全函数便不可用。

#define __STDC_WANT_LIB_EXT1__ 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){

#ifdef __STDC_WANT_LIB_EXT1__
  puts("support C11 safe version.");
#else
  puts("No support for C11 safe version.");
#endif

  // TestPerror();

  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值