字符串操作常用函数和安全用法
1. snprintf()和sprintf()
sprintf例子代码:
void f(const char *p)
{
char buf[11]={0};
char *str = "hello world";
sprintf(buf,"%s",p);
printf("%sn",buf);
}
对于以上sprintf的应用中,没有考虑到目的字符串的长度11,当拷贝到‘\0’是会发生缓冲区溢出的想象。为安全期间推荐使用snprintf
void f(const char *p)
{
char buf[11]={0};
char *str = "hello world";
sprintf(buf,11,"%s",p);
printf("%sn",buf);
}
运行结果
hello worl
snprintf()函数中加入了拷贝限制书n,其中包括n-1个格式化字符串,第n个为结束符‘\0’。返回值表示了格式化字符串长度,不包括‘\0’。
我们一般将n设置为目的指针的所能存储字符的长度,,其中包括‘\0’
2. strcat(*dest, *src, size_t size)和strncatt(*dest, *src, size_t size)
strca()实现了两个字符串的连接,将src中的字符串连接在dest后,并且覆盖dest的‘\0’
strncat()实现了将两个字符串的连接,但是只能拷贝最多size个字符至dest,其中不包括‘\0’
这两个函数均有可能发生缓冲器溢出
3 char *strcpy(char *dest, const char *src)和.char *strncpy(char *dest, const char *src, size_t count)
1. strcpy拷贝字符串src至dest,但是是遇见‘\0’停止,如果第二个字符串无结束符会遭遇segment fault,访问了非法或空地址
2. strncpy中直接拷贝n个字符至dest,并且包括‘\0’