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

打印 上一主题 下一主题

主题 656|帖子 656|积分 1968

前言

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

输入输出

sprintf

功能
  1. 发送格式化输出到 str 所指向的字符串
复制代码
sprintf()函数

C 尺度库
  1. #include <stdio.h>
复制代码
函数原型
  1. int sprintf(char *str, const char *format, ...)
复制代码
参数说明
  1. str -- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
  2. format -- 字符串,包含了要被写入到字符串 str 的文本。包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier
复制代码
返回值
  1. 如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
复制代码
举例
  1. char str[100];
  2. int len = sprintf(str, "Pi 的值 = %f", M_PI);
复制代码
详见sprintf()函数。
sprintf_s()函数

C 尺度库
  1. #include <stdio.h>
复制代码
函数原型
  1. int sprintf_s(char *str, size_t sizeOfBuffer, const char *format, ...)
复制代码
参数说明
  1. str -- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
  2. sizeOfBuffer -- 指定缓冲区长度来避免sprintf()存在的溢出风险。
  3. format -- 字符串,包含了要被写入到字符串 str 的文本。包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier
复制代码
返回值
  1. 如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
复制代码
举例
  1. char str[100];
  2. int len = sprintf_s(str, sizeof(str), "Pi 的值 = %f", M_PI);
复制代码
scanf

功能
  1. 从标准输入 stdin 读取格式化输入
复制代码
scanf()函数

C 尺度库
  1. #include <stdio.h>
复制代码
函数原型
  1. int scanf(const char *format, ...)
复制代码
参数说明
  1. format -- 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符和format说明符。 format说明符形式为[=%[*][width][modifiers]type=]
复制代码
返回值
  1. 如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回EOF
复制代码
举例
  1. int a;
  2. char b;
  3. char c[10];
  4. int len = scanf("%d %c %s",&a, &b, &c);;
复制代码
详见scanf()函数。
scanf_s()函数

C 尺度库
  1. #include <stdio.h>
复制代码
函数原型
  1. int scanf_s( const char *format [, argument]...)
复制代码
参数说明
  1. format -- 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符和format说明符。 format 说明符形式为[=%[*][width][modifiers]type=]
复制代码
返回值
  1. 如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回EOF
复制代码
举例
  1. int a;
  2. char b;
  3. char c[10];
  4. int len = scanf_s("%d %c %s",&a, &b, 1, &c, sizeof(c)); // c最多可以存放9个字符,因为c[10]要放'\0'
复制代码
内存处理

memset

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

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. void *memset(void *dest, int c, size_t n)
复制代码
参数说明
  1. dest-- 指向要填充的内存区域的指针。
  2. c -- 要设置的值,通常是一个无符号字符。
  3. n -- 要被设置为该值的字节数。
复制代码
返回值
  1. 该值返回一个指向存储区dest的指针
复制代码
举例
  1. char buffer[10];
  2. // 将 buffer 数组的前5个字节设置为字符 'A'
  3. memset(buffer, 'A', 5);
复制代码
详见memset()函数。
memset_s()函数

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. errno_t memset_s(void * dest, size_t destSize, int c, size_t n)
复制代码
参数说明
  1. dest -- 指向要填充的内存区域的指针。
  2. destSize -- 目标数组的大小
  3. c -- 要设置的值,通常是一个无符号字符。
  4. n -- 要被设置为该值的字节数。
复制代码
返回值
  1. 1) dest的副本,本质为更底层操作的临时内存地址,在实际操作中不建议直接使用此地址,操作完成以后,真正有意义的地址是dest本身。
  2. 2) 成功时为零,失败时为非零。在失败时,若 dest 不是空指针且 destSize 合法,则亦写入 destSize 个填充字节 c 到目标数组。
复制代码
举例
  1. char buffer[10];
  2. // 将 buffer 数组的前5个字节设置为字符 'A'
  3. memset(buffer, sizeof(buffer), 'A', 5);
复制代码
memcpy

功能
  1. 从存储区 str2 复制 n 个字节到存储区 str1
复制代码
memcpy()函数

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. void *memcpy(void *str1, const void *str2, size_t n)
复制代码
参数说明
  1. str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
  2. str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
  3. n -- 要被复制的字节数。
复制代码
返回值
  1. 该函数返回一个指向目标存储区 str1 的指针。
复制代码
举例
  1. const char src[50] = "http://www.baidu.com";
  2. char dest[50];
  3. memcpy(dest, src, strlen(src)+1);
复制代码
详见memcpy()函数。
memcpy_s()函数

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. errno_t memcpy_s(void *dest, size_t destSize, const void *src, size_t count);
复制代码
参数说明
  1. dest:目标数组,或者说目标内存区域
  2. destSize:目标内存区域的大小,其单位是字节
  3. src:源数组,或者说源内存区域
  4. count:要复制的源内存区域元素的个数,其单位是字节
复制代码
返回值
  1. 返回一个整数,0表示复制成功,返回非0值代表复制不成功,不同的值表示不同的错误
复制代码
举例
  1. const char src[50] = "http://www.baidu.com";
  2. char dest[50];
  3. memcpy(dest, sizeof(dest), src, strlen(src)+1);
复制代码
字符串处理

strcpy

功能
  1. 把 src 所指向的字符串复制到 dest
复制代码
strcpy()函数

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. char *strcpy(char *dest, const char *src)
复制代码
参数说明
  1. dest -- 指向用于存储复制内容的目标数组。
  2. src -- 要复制的字符串。
复制代码
返回值
  1. 该函数返回一个指向最终的目标字符串 dest 的指针。
复制代码
举例
  1. char src[50] = "http://www.baidu.com";
  2. char dest[50];
  3. strcpy(dest, src);
复制代码
详见strcpy()函数。
strcpy_s()函数

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. errno_t strcpy_s(char *dest, size_t destSize, const char *src);
复制代码
参数说明
  1. dest:拷贝完成之后的字符串
  2. destSize:dest目标缓冲区长度
  3. src:需要拷贝的字符串
复制代码
返回值
  1. 返回一个整数,0表示复制成功,返回非0值代表复制不成功,不同的值表示不同的错误
复制代码
举例
  1. const char src[50] = "http://www.baidu.com";
  2. char dest[50];
  3. strcpy_s(dest, sizeof(dest), src);
复制代码
strncpy

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

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. char *strncpy(char *dest, const char *src, size_t n)
复制代码
参数说明
  1. dest -- 指向用于存储复制内容的目标数组。
  2. src -- 要复制的字符串。
  3. n -- 要从源中复制的字符数
复制代码
返回值
  1. 该函数返回最终复制的字符串。
复制代码
举例
  1. char src[50] = "http://www.baidu.com";
  2. char dest[50];
  3. strncpy(dest, src, strlen(src) + 1);
复制代码
详见strncpy()函数。
strncpy_s()函数

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. errno_t strncpy_s(char *dest, size_t destSize, const char *src, size_t n);
复制代码
参数说明
  1. dest -- 指向用于存储复制内容的目标数组。
  2. destSize -- dest目标缓冲区长度
  3. src -- 要复制的字符串。
  4. n -- 要从源中复制的字符数
复制代码
返回值
  1. 在成功时返回零,错误时返回非零值。
复制代码
举例
  1. const char src[50] = "http://www.baidu.com";
  2. char dest[50];
  3. strncpy_s(dest, sizeof(dest), src, strlen(src) + 1);
复制代码
strcat

功能
  1. 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾
复制代码
strcat()函数

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. char *strcat(char *dest, const char *src)
复制代码
参数说明
  1. dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
  2. src -- 指向要追加的字符串,该字符串不会覆盖目标字符串。
复制代码
返回值
  1. 该函数返回一个指向最终的目标字符串 dest 的指针。
复制代码
举例
  1. char src[50] = "http://www.baidu.com";
  2. char dest[100] = "baidu: ";
  3. strcat(dest, src);
复制代码
详见strcat()函数。
strcat_s()函数

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. errno_t strcat_s(char *dest, size_t destSize, const char *src);
复制代码
参数说明
  1. dest -- 目标字符串
  2. destSize -- dest目标缓冲区长度, 拼接后的字符串大小(并非目标字符串大小也并非原始字符串大小)
  3. src -- 需要追加的字符串
复制代码
返回值
  1. 在成功时返回零,错误时返回非零值。
复制代码
举例
  1. char src[50] = "http://www.baidu.com";
  2. char dest[100] = "baidu: ";
  3. strcat_s(dest, sizeof(dest), src);
复制代码
strtok

功能
  1. 分解字符串 str 为一组字符串,delim 为分隔符
复制代码
strtok()函数

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. char *strtok(char *str, const char *delim)
复制代码
参数说明
  1. str -- 要被分解成一组小字符串的字符串。
  2. delim -- 包含分隔符的 C 字符串。
复制代码
返回值
  1. 该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。
复制代码
举例
  1. char str[50] = "This is http://www.baidu.com";
  2. char delim[2] = " ";
  3. char *token;
  4. /* 获取第一个子字符串 */
  5. token = strtok(str, delim);
  6. /* 继续获取其他的子字符串 */
  7. while (token != NULL) {
  8.    printf( "%s\n", token );
  9.    token = strtok(NULL, delim);
  10. }
复制代码
详见strtok()函数。
strtok_s()函数

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. char * strtok_s(char *dest, size_t *strmax, const char *delim, char **ptr);
复制代码
参数说明
  1. str -- 要被分解成一组小字符串的字符串。
  2. strmax -- 指向最初保存str大小的对象的指针:strtok_s存储待检查的字符数。
  3. delim -- 包含分隔符的 C 字符串。
  4. ptr -- 指向char *类型的对象的指针,strtok_s用它来存储它的内部状态
复制代码
返回值
  1. 返回指向下一个标记开头的指针,如果没有其他标记,则返回NULL
复制代码
举例
  1. char str[50] = "This is http://www.baidu.com";
  2. char delim[2] = " ";
  3. size_t strmax = sizeof(str);
  4. char *next_token;
  5. token = strtok_s(str, &strmax, delim, &next_token);
  6. while (token != NULL) {
  7.     printf( "%s\n", token);
  8.     token = strtok_s(NULL, &strmax, delim, &next_token);
  9. }
复制代码
其他常用字符串函数

strcmp

功能
  1. 把 str1 所指向的字符串和 str2 所指向的字符串进行比较
复制代码
strcmp()函数

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. int strcmp(const char *str1, const char *str2)
复制代码
参数说明
  1. str1 -- 要进行比较的第一个字符串。
  2. str2 -- 要进行比较的第二个字符串。
复制代码
返回值
  1. 如果返回值小于 0,则表示 str1 小于 str2。
  2. 如果返回值大于 0,则表示 str1 大于 str2。
  3. 如果返回值等于 0,则表示 str1 等于 str2。
复制代码
举例
  1. char str1[15] = "abcdef";
  2. char str2[15] = "ABCDEF";
  3. ret = strcmp(str1, str2);
  4. if(ret < 0)
  5. {
  6.    printf("str1 小于 str2");
  7. }
  8. else if(ret > 0)
  9. {
  10.    printf("str1 大于 str2");
  11. }
  12. else
  13. {
  14.    printf("str1 等于 str2");
  15. }
复制代码
详见strcmp()函数。
strstr

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

C 尺度库
  1. #include <string.h>
复制代码
函数原型
  1. char *strstr(const char *haystack, const char *needle)
复制代码
参数说明
  1. haystack -- 要被检索的 C 字符串。
  2. needle -- 在 haystack 字符串内要搜索的小字符串。
复制代码
返回值
  1. 该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。
复制代码
举例
  1. char haystack[50] = "http://www.baidu.com";
  2. char needle[10] = "baidu";
  3. strstr(haystack, needle);
复制代码
详见strstr()函数。
伤害函数列表

内存拷贝函数:memcpy(), wmemcpy(), memmove(), wmemmove()
内存初始化函数:memset()
字符串拷贝函数:strcpy(), wcscpy(),strncpy(), wcsncpy()
字符串拼接函数:strcat(), wcscat(),strncat(), wcsncat()
字符串格式化输出函数:sprintf(), swprintf(), vsprintf(), vswprintf(), snprintf(), vsnprintf()
字符串格式化输入函数:scanf(), wscanf(), vscanf(), vwscanf(), fscanf(), fwscanf(),vfscanf(),vfwscanf(),sscanf(), swscanf(), vsscanf(), vswscanf()
stdin流输入函数:gets()

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表