前言
本文章描述常用的不安全函数与对应的安全函数的使用。
不安全函数原型参考菜鸟教程。
不安全函数与相应的安全函数
输入输出
sprintf
功能
发送格式化输出到 str 所指向的字符串
sprintf()函数
C 标准库
#include<stdio.h>
函数原型
intsprintf(char*str,constchar*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>
函数原型
intsprintf_s(char*str,size_t sizeOfBuffer,constchar*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>
函数原型
intscanf(constchar*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>
函数原型
intscanf_s(constchar*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,constvoid*str2,size_t n)
参数说明
str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
n -- 要被复制的字节数。
返回值
该函数返回一个指向目标存储区 str1 的指针。
举例
constchar src[50]="http://www.baidu.com";char dest[50];memcpy(dest, src,strlen(src)+1);
详见memcpy()函数。
memcpy_s()函数
C 标准库
#include<string.h>
函数原型
errno_tmemcpy_s(void*dest,size_t destSize,constvoid*src,size_t count);
参数说明
dest:目标数组,或者说目标内存区域
destSize:目标内存区域的大小,其单位是字节
src:源数组,或者说源内存区域
count:要复制的源内存区域元素的个数,其单位是字节
返回值
返回一个整数,0表示复制成功,返回非0值代表复制不成功,不同的值表示不同的错误
举例
constchar 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,constchar*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_tstrcpy_s(char*dest,size_t destSize,constchar*src);
参数说明
dest:拷贝完成之后的字符串
destSize:dest目标缓冲区长度
src:需要拷贝的字符串
返回值
返回一个整数,0表示复制成功,返回非0值代表复制不成功,不同的值表示不同的错误
举例
constchar 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,constchar*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_tstrncpy_s(char*dest,size_t destSize,constchar*src,size_t n);
参数说明
dest -- 指向用于存储复制内容的目标数组。
destSize -- dest目标缓冲区长度
src -- 要复制的字符串。
n -- 要从源中复制的字符数
返回值
在成功时返回零,错误时返回非零值。
举例
constchar 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,constchar*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_tstrcat_s(char*dest,size_t destSize,constchar*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,constchar*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,constchar*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>
函数原型
intstrcmp(constchar*str1,constchar*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");}elseif(ret >0){printf("str1 大于 str2");}else{printf("str1 等于 str2");}
详见strcmp()函数。
strstr
功能
在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
strstr()函数
C 标准库
#include<string.h>
函数原型
char*strstr(constchar*haystack,constchar*needle)
参数说明
haystack -- 要被检索的 C 字符串。
needle -- 在 haystack 字符串内要搜索的小字符串。
返回值
该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。
举例
char haystack[50]="http://www.baidu.com";char needle[10]="baidu";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()
版权归原作者 may-daydayup 所有, 如有侵权,请联系我们删除。