字符串函数源码详解
- 格式:pdf
- 大小:353.21 KB
- 文档页数:38
C语言中关于字符串的操作大全2011-04-0714:12:49|分类:C学习|标签:chardest字符串s2s1|字号订阅
转自:http://student.csdn.net/space.php?uid=470978&do=thread&id=8934前言:如果您是学C/C++的,对于字符串的操作不是很了解,请您耐心读完。作为我的朋友,我很乐意和您分享我最近的知识积累。毕竟,网上很少有这么全,这么细的介绍,更少有人愿意花时间收集N个相关帖子,读懂,并将零散的知识点整理,并思考函数之间可能的联系或改进方法。如果您觉得不错,请您分享,您的支持就是给我继续整理的动力。一.字符串相关操作分类介绍(招式篇)
1.字符串拷贝相关操作。
a.strcpy:char*strcpy(char*dest,constchar*src);复制字符串src到dest中。返回指针为dest的值。b.strncpy:char*strncpy(char*dest,constchar*src,size_tn);复制字符串src到dest中,最多复制n个字符。返回指针为dest的值。c.strdup:char*strdup(constchar*s);得到一个字符串s的复制。返回指针指向复制后的字符串的首地址。d.memcpy:void*memcpy(void*dest,constvoid*src,size_tn);从src所指向的对象复制n个字符到dest所指向的对象中。返回指针为dest的值。e.mem**y:
void*mem**y(void*dest,constvoid*src,intc,size_tn);从src所指向的对象复制n个字符到dest所指向的对象中。如果复制过程中遇到了字符c则停止复制,返回指针指向dest中字符c的下一个位置;否则返回NULL。f.memmove:void*memmove(void*dest,constvoid*src,size_tn);从src所指向的对象复制n个字符到dest所指向的对象中。返回指针为dest的值。不会发生内存重叠。2.字符串比较相关操作
a.strcmp:intstrcmp(constchar*s1,constchar*s2);比较字符串s1和字符串s2。返回值是s1与s2第一个不同的字符差值的符号,0表示相同,1表示正号,-1表示负号。b.strncmp:intstrncmp(constchar*s1,constchar*s2,size_tn);比较字符串s1和字符串s2,最多比较n个字符。返回值是s1与s2第一个不同的字符差值的符号,0:表示相同,1:表示正号,-1:表示负号。c.stricmp:intstricmp(constchar*s1,constchar*s2);比较字符串s1和字符串s2,忽略大小写。返回值是s1与s2第一个不同的字符差值的符号,0:表示相同,1:表示正号,-1:表示负号。d.strnicmp:intstrnicmp(constchar*s1,constchar*s2,size_tn);比较字符串s1和字符串s2,忽略大小写,最多比较n个字符。返回值是s1与s2第一个不同的字符差值。e.memcmp:intmemcmp(constvoid*s1,constvoid*s2,size_tn);比较s1所指向的对象和s2所指向的对象的前n个字符。返回值是s1与s2第一个不同的字符差值。f.memicmp:
intmemicmp(constvoid*s1,constvoid*s2,size_tn);比较s1所指向的对象和s2所指向的对象的前n个字符,忽略大小写。返回值是s1与s2第一个不同的字符差值的符号,0:表示相同,1:表示正号,-1:表示负号。3.字符串大小写转换相关操作
a.strlwr:char*strlwr(char*s);将字符串s全部转换成小写。返回指针为s的值。b.strupr:char*strupr(char*s);将字符串s全部转换成大写。返回指针为s的值。4.字符串连接相关操作a.strcat:char*strcat(char*dest,constchar*src);将字符串src添加到dest尾部。返回指针为dest的值。b.strncat:char*strncat(char*dest,constchar*src,size_tn);将字符串src添加到dest尾部,最多添加n个字符。返回指针为dest的值。5.字符串子串相关操作a.strstr:char*strstr(constchar*s1,constchar*s2);在字符串s1中搜索字符串s2。如果搜索到,返回指针指向字符串s2第一次出现的位置;否则返回NULL。b.strcspn:size_tstrcspn(constchar*s1,constchar*s2);返回值是字符串s1的完全由不包含在字符串s2中的字符组成的初始串长度。c.strspn:size_tstrspn(constchar*s1,constchar*s2);返回值是字符串s1的完全由包含在字符串s2中的字符组成的初始串长度。d.strpbrk:char*strpbrk(constchar*s1,constchar*s2);返回指针指向字符串s1中字符串s2的任意字符第一次出现的位置;如果未出现返回NULL。e.strtok:char*strtok(char*s1,constchar*s2);用字符串s2中的字符做分隔符将字符串s1分割。返回指针指向分割后的字符串。第一次调用后需用NULLL替代s1作为第一个参数。6.字符串与单个字符相关操作a.strchr:char*strchr(constchar*s,intc);在字符串s中搜索字符c。如果搜索到,返回指针指向字符c第一次出现的位置;否则返回NULL。b.strrchr:char*strrchr(constchar*s,intc);在字符串s中搜索字符c。如果搜索到,返回指针指向字符c最后一次出现的位置;否则返回NULL。c.memchr:void*memchr(constvoid*s,intc,size_tn);在s所指向的对象的前n个字符中搜索字符c。如果搜索到,返回指针指向字符c第一次出现的位置;否则返回NULL。d.memset:void*memset(void*s,intc,size_tn);设置s所指向的对象的前n个字符为字符c。返回指针为s的值。e.strnset:char*strnset(char*s,intch,size_tn);设置字符串s中的前n个字符全为字符c。返回指针为s的值。f.strset:char*strset(char*s,intch);设置字符串s中的字符全为字符c。返回指针为s的值。7..字符串求字符串长度相关操作a.strlen:size_tstrlen(constchar*s);返回值是字符串s的长度。不包括结束符\0。8..字符串错误相关操作a.strerror:char*strerror(interrnum);返回指针指向由errnum所关联的出错消息字符串的首地址。errnum的宏定义见errno.h。9..字符串反置操作a.strrev:char*strrev(char*s);将字符串全部翻转,返回指针指向翻转后的字符串。
二.记忆方法(记忆心法精要)最好的方法莫过于多用了,但是具体函数的名字的记忆也是有技巧的。
str:字符串cmp:比较n:代表范围i:表示不区分大小写
rev:翻转error:错误len:长度mem:内存cat:连接lwr:小写upr:大写set:设置(单个字符)chr:单个字符(查找)注:1.只要是关于内存操作(mem…)的,则必有一个参数size_tn,表示对操作内存的大小。这与strn…函数在功能上类似,只是,strn…函数一般在没达到n个字节之前遇到空字符时会结束,而mem…遇到空字符并不结束。2.str/mem+[n]chr:表示在字符串中查找某个字符,而str/mem+[n]set:表示把字符串设置成某个字符,n表示作用范围为前n个。3.strdup中返回的指针是new出来的,用完一定要记得delete。
三.源码&&解析&&BUG:(内功篇)1.字符串拷贝相关操作。a.strcpy:复制字符串src到dest中。返回指针为dest的值。char*strcpy(char*dest,constchar*src){assert((dest!=NULL)&&(src!=NULL));char*p=dest;while(*p++=*src++);return(dest);}解析:1.assert:断言,即assert(),()里的一定为真,否则程序报错。2.*src++中,++后置的优先级比*高,所以相当于*(src++),src++的意思是,先取出src的值,再++,所以*src++;等同于:*src;src++;3.将src指针所指地址中所有字符串都复制到dest指针所指地址中,直至遇到空字符才结束。并且dest和返回指针都指向拷贝后地址空间的首地址。