花了两天的时间总结了Linux编程时的字符串操作函数和字节序列操作函数,以便后续查阅。
这些函数大都不会去检查传入的参数是否为NULL,因此在使用之前要自己做检查,否则后果你懂的。
一个基本知识点:
字符串处理中,如strcpy,字符串都是以’\0’来判断结束的。
字节序列处理中,如memcpy,操作内存字节,不在乎’\0’或其他字符。
下列函数基本都包含在头文件string.h中,如果不是会特别指出。
#include <string.h>
–
下面开始介绍,给出函数定义并解释作用和用法。
strlen
size_t strlen(const char *s);
计算字符串长度(不包括’\0’)。
strnlen
#define _GNU_SOURCE
size_t strnlen(const char *s, size_t maxlen);
计算字符串长度(不包括’\0’)。但如果字符串长度超过maxlen,返回maxlen。
strcpy
char *strcpy(char *dest, const char *src);
字符串拷贝,将src指向的字符串内容拷贝到dest,拷贝到’\0’为止(包含’\0’)。如果src的字符串长度超过dest提供的空间,则结果不可预期,例如可能发生栈溢出或者覆盖其他变量内容等。
strncpy
char *strncpy(char *dest, const char *src, size_t n);
作用同strcpy,拷贝到’\0’为止,最多拷贝n个字符(不计’\0’)。即,如果strlen(src) < n,则拷贝src后,dest剩余字节都用’\0’填充;如果strlen(src) >= n,则只拷贝n个字符,并且这时需要注意的是,dest就没有地方放’\0’了,因此我们在拷贝n字符时,给dest定义的大小为n+1字节。
另外,strncpy的效率肯定比strcpy低,如果注重效率问题,可以在保证不会越界的前提下使用strcpy。
memcpy
void *memcpy(void *dest, const void *src, size_t n);
将src指向的内存的前n字节拷贝到dest。不能处理src和dest内存有重叠的情况。函数返回指向dest的指针。
bcopy
void bcopy(const void *src, void *dest, size_t n);
该函数类似memcpy,但是src和dest的参数位置不同,能够处理内存区域重叠的情况。已经deprecated,不要用了。
memmove
void *memmove(void *dest, const void *src, size_t n);
将src指向的内存的前n字节拷贝到dest。能够处理src和dest内存有重叠的情况。函数返回指向dest的指针。
memccpy
void *memccpy(void *dest, const void *src, int c, size_t n);
从src拷贝n字节到dest,但是碰到字符c就停止(c会拷贝到dest),函数返回dest中字符c后面的位置的指针,如果在src的n个字节内没有找到c,则返回NULL。
strdup
char *strdup(const char *s);
复制一份字符串s。在函数里面会有malloc操作来为新字符串申请空间,然后拷贝字符串s(包括’\0’)到新字符串。该函数返回新字符串的指针,如果无法申请到内存,则返回NULL(errno=ENOMEM)。
因为有malloc,因此,在用完新字符串指针后,要记得free()掉。
strndup
char *strndup(const char *s, size_t n);
同strdup,最多拷贝n个字符,如果strlen(s)>=n,则新字符串后面会再补一个’\0’。
strdupa,strndupa
char *