在C语言中,str和mem是常用于进行数组类数据的操作,
而str类型的函数一般适用于字符类数据的操作,mem类型的函数适用于各种类型数据的操作,本文对这两种类型进行简单的介绍。
个人觉得mem和str这两者的最大区别在于处理的数组中是否有NULL这个符号,即mem可以处理有NULL的数组,而str无法处理拥有NULL的数组。
它们的头文件都是<string.h>
一、用于数组的初始化
一般而言,memset都被用于对数组进行初始化,而str中没有该类型的函数。
memset的函数:void *memset(void *s, int ch, size_t n);
功能解释:将s所指向的地址为初始地址,将其后面的n个字节(包括s所指的那个字节)用ch替代,并返回s的数值。
ch一般为ASCII码的十进制数值。
详解:http://blog.csdn.net/qwe15954250805/article/details/77411430
二、用于数组的赋值
str的数据拷贝:
//将字符串src复制到dst里面,其返回值为dst的地址;
char *strcpy*(char *dst, char const *src);
//从src复制len个字符到dst里,返回dst的地址,dst的尾部可能会没有NUL,若src的长度不足len的长度,则自动以NULL补足。
char *strncpy(char *dst, char const *src, size_t len);
//将字符串src复制到dst里面,其返回值为dst里 NULL 的地址;
char *stpcpy*(char *dst, char const *src);
//从src复制len个字符到dst里,返回dst中复制src后随之的字符的地址,若src的长度不足len的长度,则自动以NULL补足,并返回第一个NULL处。
char *stpncpy(char *dst, char const *src, size_t len);
mem的数据拷贝:
//从src所指的地址开始拷贝n个字节到dst所指的地址处,返回值为dst所指的地址
void *memcpy(void *dst, void *src, size_t n);
//从src所指的地址开始拷贝n个字节到dst所指的地址处,返回值为dst之后第一个字节的地址
void *mempcpy(void *dst, void *src, size_t n);
//由src所指内存区域复制不多于count个字节到dest所指内存区域,如果遇到字符c则停止复制。
//返回值:如果c没有被复制,则返回NULL,否则,返回字符c 后面紧挨一个字符位置的指针。
void memccpy(void *dest, void *src, unsigned char c, unsigned int count);
memcpy、strcpy和strncpy的详解:http://blog.csdn.net/qwe15954250805/article/details/77428730
mempcpy、stpcpy和stpncpy的详解:http://write.blog.csdn.net/postedit/76165446
三、用于数据的查找
mem的数据查找:
//从buf所指内存区域的前count个字节查找字符ch,当第一次遇到字符ch时停止查找。若成功,则返回指向字符ch的指针,否则返回NULL。
void *memchr(const void *buf, int ch, size_t count);
//从buf所指内存区域的前count个字节查找字符ch,当最后一次遇到字符ch时停止查找。若成功,则返回指向字符ch的指针,否则返回NULL。
void *memrchr(const void *s, int c_in, size_t n);
//该函数是GNU的扩展函数,非C的标准函数
//与strstr类似,只是haystack_start和needle_start为字符数组,用于寻找needle_start在haystack_start中第一次出现的位置,成功则返回该位置的地址,失败返回NULL
void *memmem(const void *haystack_start, size_t haystack_len, const void *needle_start, size_t needle_len);
str的数据查找
//获得字符ch在str里第一次出现的地址,其返回值为该地址
char * strchr(char const *str, int ch);
//获得字符ch在str里最后一次出现的地址,返回值为对应地址
char * strrchr(char const *str,int ch);
//获得字符串group里任意一个字符在str里第一次出现的地址,并返回该地址,若失败,返回NULL
char *strpbrk(char const *str, char const *group);
//查找字符串dest在字符串src中第一次出现的位置,若成功则返回该位置的地址,失败则返回NULL
char strstr(char const* src, char const *dest);
四、数据的对比
mem的数据对比
//对比内存区域buf1和buf2的前count个字节
int memcmp(const void *buf1, const void *buf2, unsigned int count)
str的数据对比
//对比字符串s1和s2,相等返回1,s1大于s2则返回正数,s1小于s2则返回负数
int strcmp(char const *s1, char const *s2);
//对比字符串s1和s2前len个字符是否相等
int strncmp(char const *s1,char const *s2,size_t len);
memcmp、strcmp和strncmp的详解:http://blog.csdn.net/qwe15954250805/article/details/76650954
五、其它
str的隐藏或加密:
//用于隐藏字符串中的一部分字符,将对应长度的字符串和42进行XOR来进行隐藏原来的字符,复原可以通过再执行一次函数
void *memfrob(void *s,size_t n);
str的黏贴:
//用src取代dst尾部的'/0',并且返回值为dst的地址,相当于黏贴
char *strcat(char *dst, char const *src);
//从src里取n个字符取代dst尾部的'/0',并且返回值为dst的地址,相当于黏贴
char *strncat(char *s1, const char *s2, size_t n);
strcat、strncat和自编memcat的介绍:http://blog.csdn.net/qwe15954250805/article/details/77540017
str的求字符长度:
//求字符串string的长度(不包括电脑自动添加的‘/0’)
size_t strlen(char const*string);
str的字符数量提取:
//返回从str开头开始与group不一样的字符数
size_t strcspn(char const *str,char const* group);
//返回从str开头开始与group一致的字符数
size_t strspn(char const *str, char const *group);
int len1,len2;
char buffer[] = "25,142,330,Smith,J,239-4123";
len1 = strspn(buffer, "0123456789"); //len1为2,因为25后面是逗号','
len2 = strspn(buffer, ",0123456789"); //len2为11,因为“330,”的后面是S
查找标记:
//用于提取字符串str中被sep所分隔的各个字符串,失败返回NULL
char *strtok(char *str, char const *sep);
自己编的一个用于提取指定字符串:
void cb_stringpick(char *src, char *begin,char middle[], char *end)
{
char temp[1024];
unsigned int begin_len = 0;
unsigned int middle_len = 0;
strcpy(temp,strstr(src,begin));
begin_len = strlen(begin);
char *tmp = strstr(src,end);
char *tmp1 = strstr(src,begin)+begin_len;
for(int i=0;tmp1!=tmp;i++){
middle[i] = temp[i+begin_len];
tmp1++;
middle_len ++;
}
middle[middle_len] = '\0';
}
PS:因为字符串在C中是以常量的形式存在的,所以如果使用char*的形式,则要么
在初始化时给字符串赋值 ,比如 char * str = ”abcd“;
要么将其设为 char * str = NULL;
但字符串一旦定义以后便不能对其进行修改了,故如果字符串是要修改的话,应该将其定义为字符数组:
char str[] = "abcd";
文尾附上一个更加详细的介绍:http://www.eetop.cn/blog/html/92/23692-15612.html