首页 > 其他分享 >【安全函数】常用的安全函数的使用

【安全函数】常用的安全函数的使用

时间:2024-06-13 20:32:22浏览次数:11  
标签:src 常用 函数 dest char 安全 字符串 --

前言

本文章描述常用的不安全函数与对应的安全函数的使用。
不安全函数原型参考菜鸟教程

不安全函数与相应的安全函数

输入输出

sprintf

功能

发送格式化输出到 str 所指向的字符串
sprintf()函数

C 标准库

#include <stdio.h>

函数原型

int sprintf(char *str, const char *format, ...)

参数说明

str -- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
format -- 字符串,包含了要被写入到字符串 str 的文本。包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier

返回值

如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。

举例

char str[100];
int len = sprintf(str, "Pi 的值 = %f", M_PI);

详见sprintf()函数

sprintf_s()函数

C 标准库

#include <stdio.h>

函数原型

int sprintf_s(char *str, size_t sizeOfBuffer, const char *format, ...)

参数说明

str -- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
sizeOfBuffer -- 指定缓冲区长度来避免sprintf()存在的溢出风险。
format -- 字符串,包含了要被写入到字符串 str 的文本。包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier

返回值

如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。

举例

char str[100];
int len = sprintf_s(str, sizeof(str), "Pi 的值 = %f", M_PI);

scanf

功能

从标准输入 stdin 读取格式化输入
scanf()函数

C 标准库

#include <stdio.h>

函数原型

int scanf(const char *format, ...)

参数说明

format -- 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符和format说明符。 format说明符形式为[=%[*][width][modifiers]type=]

返回值

如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回EOF

举例

int a;
char b;
char c[10];
int len = scanf("%d %c %s",&a, &b, &c);;

详见scanf()函数

scanf_s()函数

C 标准库

#include <stdio.h>

函数原型

int scanf_s( const char *format [, argument]...)

参数说明

format -- 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符和format说明符。 format 说明符形式为[=%[*][width][modifiers]type=]

返回值

如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回EOF

举例

int a;
char b;
char c[10];
int len = scanf_s("%d %c %s",&a, &b, 1, &c, sizeof(c)); // c最多可以存放9个字符,因为c[10]要放'\0'

内存处理

memset

功能

将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零或设置为特定值
memset()函数

C 标准库

#include <string.h>

函数原型

void *memset(void *dest, int c, size_t n)

参数说明

dest-- 指向要填充的内存区域的指针。
c -- 要设置的值,通常是一个无符号字符。
n -- 要被设置为该值的字节数。

返回值

该值返回一个指向存储区dest的指针

举例

char buffer[10];
// 将 buffer 数组的前5个字节设置为字符 'A'
memset(buffer, 'A', 5);

详见memset()函数

memset_s()函数

C 标准库

#include <string.h>

函数原型

errno_t memset_s(void * dest, size_t destSize, int c, size_t n)

参数说明

dest -- 指向要填充的内存区域的指针。
destSize -- 目标数组的大小
c -- 要设置的值,通常是一个无符号字符。
n -- 要被设置为该值的字节数。

返回值

1) dest的副本,本质为更底层操作的临时内存地址,在实际操作中不建议直接使用此地址,操作完成以后,真正有意义的地址是dest本身。
2) 成功时为零,失败时为非零。在失败时,若 dest 不是空指针且 destSize 合法,则亦写入 destSize 个填充字节 c 到目标数组。

举例

char buffer[10];
// 将 buffer 数组的前5个字节设置为字符 'A'
memset(buffer, sizeof(buffer), 'A', 5);

memcpy

功能

从存储区 str2 复制 n 个字节到存储区 str1
memcpy()函数

C 标准库

#include <string.h>

函数原型

void *memcpy(void *str1, const void *str2, size_t n)

参数说明

str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
n -- 要被复制的字节数。

返回值

该函数返回一个指向目标存储区 str1 的指针。

举例

const char src[50] = "http://www.baidu.com";
char dest[50];
memcpy(dest, src, strlen(src)+1);

详见memcpy()函数

memcpy_s()函数

C 标准库

#include <string.h>

函数原型

errno_t memcpy_s(void *dest, size_t destSize, const void *src, size_t count);

参数说明

dest:目标数组,或者说目标内存区域
destSize:目标内存区域的大小,其单位是字节
src:源数组,或者说源内存区域
count:要复制的源内存区域元素的个数,其单位是字节

返回值

返回一个整数,0表示复制成功,返回非0值代表复制不成功,不同的值表示不同的错误

举例

const char src[50] = "http://www.baidu.com";
char dest[50];
memcpy(dest, sizeof(dest), src, strlen(src)+1);

字符串处理

strcpy

功能

把 src 所指向的字符串复制到 dest
strcpy()函数

C 标准库

#include <string.h>

函数原型

char *strcpy(char *dest, const char *src)

参数说明

dest -- 指向用于存储复制内容的目标数组。
src -- 要复制的字符串。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

举例

char src[50] = "http://www.baidu.com";
char dest[50];
strcpy(dest, src);

详见strcpy()函数

strcpy_s()函数

C 标准库

#include <string.h>

函数原型

errno_t strcpy_s(char *dest, size_t destSize, const char *src);

参数说明

dest:拷贝完成之后的字符串
destSize:dest目标缓冲区长度
src:需要拷贝的字符串

返回值

返回一个整数,0表示复制成功,返回非0值代表复制不成功,不同的值表示不同的错误

举例

const char src[50] = "http://www.baidu.com";
char dest[50];
strcpy_s(dest, sizeof(dest), src);

strncpy

功能

把 src 所指向的字符串复制到 dest,最多复制 n 个字符。
当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
strncpy()函数

C 标准库

#include <string.h>

函数原型

char *strncpy(char *dest, const char *src, size_t n)

参数说明

dest -- 指向用于存储复制内容的目标数组。
src -- 要复制的字符串。
n -- 要从源中复制的字符数

返回值

该函数返回最终复制的字符串。

举例

char src[50] = "http://www.baidu.com";
char dest[50];
strncpy(dest, src, strlen(src) + 1);

详见strncpy()函数

strncpy_s()函数

C 标准库

#include <string.h>

函数原型

errno_t strncpy_s(char *dest, size_t destSize, const char *src, size_t n);

参数说明

dest -- 指向用于存储复制内容的目标数组。
destSize -- dest目标缓冲区长度
src -- 要复制的字符串。
n -- 要从源中复制的字符数

返回值

在成功时返回零,错误时返回非零值。 

举例

const char src[50] = "http://www.baidu.com";
char dest[50];
strncpy_s(dest, sizeof(dest), src, strlen(src) + 1);

strcat

功能

把 src 所指向的字符串追加到 dest 所指向的字符串的结尾
strcat()函数

C 标准库

#include <string.h>

函数原型

char *strcat(char *dest, const char *src)

参数说明

dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
src -- 指向要追加的字符串,该字符串不会覆盖目标字符串。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

举例

char src[50] = "http://www.baidu.com";
char dest[100] = "baidu: ";
strcat(dest, src);

详见strcat()函数

strcat_s()函数

C 标准库

#include <string.h>

函数原型

errno_t strcat_s(char *dest, size_t destSize, const char *src);

参数说明

dest -- 目标字符串
destSize -- dest目标缓冲区长度, 拼接后的字符串大小(并非目标字符串大小也并非原始字符串大小)
src -- 需要追加的字符串

返回值

在成功时返回零,错误时返回非零值。 

举例

char src[50] = "http://www.baidu.com";
char dest[100] = "baidu: ";
strcat_s(dest, sizeof(dest), src);

strtok

功能

分解字符串 str 为一组字符串,delim 为分隔符
strtok()函数

C 标准库

#include <string.h>

函数原型

char *strtok(char *str, const char *delim)

参数说明

str -- 要被分解成一组小字符串的字符串。
delim -- 包含分隔符的 C 字符串。

返回值

该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。

举例

char str[50] = "This is http://www.baidu.com";
char delim[2] = " ";
char *token;
/* 获取第一个子字符串 */
token = strtok(str, delim);
/* 继续获取其他的子字符串 */
while (token != NULL) {
   printf( "%s\n", token );
   token = strtok(NULL, delim);
}

详见strtok()函数

strtok_s()函数

C 标准库

#include <string.h>

函数原型

char * strtok_s(char *dest, size_t *strmax, const char *delim, char **ptr);

参数说明

str -- 要被分解成一组小字符串的字符串。
strmax -- 指向最初保存str大小的对象的指针:strtok_s存储待检查的字符数。
delim -- 包含分隔符的 C 字符串。
ptr -- 指向char *类型的对象的指针,strtok_s用它来存储它的内部状态

返回值

返回指向下一个标记开头的指针,如果没有其他标记,则返回NULL 

举例

char str[50] = "This is http://www.baidu.com";
char delim[2] = " ";
size_t strmax = sizeof(str);
char *next_token;
token = strtok_s(str, &strmax, delim, &next_token);
while (token != NULL) {
    printf( "%s\n", token);
    token = strtok_s(NULL, &strmax, delim, &next_token);
}

其他常用字符串函数

strcmp

功能

把 str1 所指向的字符串和 str2 所指向的字符串进行比较
strcmp()函数

C 标准库

#include <string.h>

函数原型

int strcmp(const char *str1, const char *str2)

参数说明

str1 -- 要进行比较的第一个字符串。
str2 -- 要进行比较的第二个字符串。

返回值

如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。

举例

char str1[15] = "abcdef";
char str2[15] = "ABCDEF";

ret = strcmp(str1, str2);
if(ret < 0)
{
   printf("str1 小于 str2");
}
else if(ret > 0) 
{
   printf("str1 大于 str2");
}
else 
{
   printf("str1 等于 str2");
}

详见strcmp()函数

strstr

功能

在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
strstr()函数

C 标准库

#include <string.h>

函数原型

char *strstr(const char *haystack, const char *needle)

参数说明

haystack -- 要被检索的 C 字符串。
needle -- 在 haystack 字符串内要搜索的小字符串。

返回值

该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。

举例

char haystack[50] = "http://www.baidu.com";
char needle[10] = "baidu";
strstr(haystack, needle);

详见strstr()函数

标签:src,常用,函数,dest,char,安全,字符串,--
From: https://blog.csdn.net/weixin_54954007/article/details/139198048

相关文章

  • React函数式组件环境中父组件调用子组件的方法
    importReact,{useRef,useCallback}from'react';//子组件constChildComponent=React.forwardRef((props,ref)=>{constdoSomething=useCallback(()=>{console.log('Dosomethinginthechildcomponent');},[]);......
  • 使用exec函数族,父子进程分别拷贝图片前后部分
    1#include<stdio.h>2#include<sys/stat.h>3#include<sys/types.h>4#include<unistd.h>5#include<fcntl.h>67intmain(intargc,constchar*argv[])8{9intfd_r=open("./1zh.jpg",O......
  • 2024中国网络安全产品用户调查报告(发布版)
        自2020年始,人类进入了21世纪的第二个十年,全球进入了百年未有之大变局,新十年的开始即被新冠疫情逆转了全球化发展的历程,而至2022年3月俄乌战争又突然爆发,紧接着2023年7月“巴以冲突"皱起,世界快速进入动荡中,不确定性激增,网络对抗愈演愈烈,导致中国网络安全市场和环境......
  • 龙哥量化:什么是ZXNH直线拟合指标?ZXNH信号漂移,未来函数检测不到, 函数列表没有,大坑哦哦
    这个函数太坑,先打个草稿,后面详细分析这个玩意,ZXNH(ZhixianNifangHuadong,即直线拟合滑动)指标是一种趋势跟踪技术分析指标,主要用于寻找股票价格的短期趋势。该指标基于直线拟合原理,通过对价格数据进行线性回归分析,来计算当前价格的趋势方向和趋势强度。计算ZXNH指标的方法如下:......
  • Python中常用的几个内置方法(max()/min()、filter()、map()、sorted、reduce())
    1.max()/min()传入一个参数(可迭代对象),返回这个可迭代对象中最大的元素可以设置default关键字参数,当这个可迭代对象为空时,返回default的值传入多个参数,返回这些参数中最大的参数多个参数必须是同类型的两种方法都可以设置key关键字参数(传入函数)"""max(it......
  • 用最简单的方式理解函数重载
    一、什么是函数重载函数重载的定义:在同一个作用域内,使用不同的函数名,实现不同的函数功能,而且编译器不会发生报错的情况。函数重载的条件以及注意事项:1、在同一个作用域内2、相同的函数名.3、函数参数的个数、顺序、类型不同4、函数重载与返回值无关二、函数重载发生的原......
  • 【Java中常用的设计模式总结】
    文章目录概要1、单例模式(SingletonPattern)2、工厂模式(FactoryPattern)3、建造者模式(BuilderPattern)4、原型模式(PrototypePattern)5、适配器模式(AdapterPattern)6、桥接模式(BridgePattern)7、组合模式(CompositePattern)8、装饰器模式(DecoratorPattern)9、外观模式(Facade......
  • hive函数学习
    复制粘贴到MD文档中查看更方便Hive函数学习目录Hive函数学习SQL练习Hive常用函数关系运算数值计算条件函数(主要使用场景是数据清洗的过程中使用,有些构建表的过程也是需要的)日期函数重点!!!字符串函数Hive中的wordCount1.1 Hive窗口函数1.1.1 聚合开窗函数聚合开窗函数实战:实战1......
  • B端系统导航有哪些类型?本文告诉你7个常用的。
    B端系统相对与C端来说,功能复杂,信息量大,流程负复杂,层级深,这个时候到就显得尤为重要了,直接关乎用户体验,本文大美B端工场带领大家看看这个问题。一、导航对于B端系统的重要性导航在B端系统中具有重要性,原因如下:1.提供导航和定位:B端系统通常功能复杂且模块众多,导航可以帮助用......
  • 函数递归(详解)
    一、什么是递归在C语言中,递归就是函数自己调用自己上面这个就是一个简单的递归,但是代码最终也会陷入死循环,导致栈溢出。 二、递归的举例1.求n的阶乘我们知道的n的阶乘的公式为:n!=n*(n-1)!根据函数可令n==0时,n的阶乘为1,其余的用上面公式计算2.顺序的打印整数的每一位......