C中str家族和mem家族的简介

来源:互联网 发布:core java mobi 编辑:程序博客网 时间:2024/05/24 01:38

在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









原创粉丝点击