在之前获取IP地址中,自己稍微总结了一部分,但是书到用时方恨少,今天就把自己经常用到的字符串函数整理一遍。
头文件#include <string.h>
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
编译后
原型为extern char *strchr(const char *s,char c),可以查找字符串s中首次出现字符c的位置。成功则返回要查找字符第一次出现的位置,失败返回NULL
结果:
原型声明:char *strcpy(char* dest, const char *src); 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 常用于字符串赋值
结果:
[fanmaolin@Centeros str]$ gcc str.c [fanmaolin@Centeros str]$ ./a.out My name is fanmaolin和strcpy用法类似,可以防止溢出
函数原型char *strncpy(char *dest,char *src,size_t n);
(c/c++)复制字符串src中的内容(字符,数字、汉字….)到字符串dest中,复制多少由size_tn的值决定。
4 #include <stdio.h> 15 #include <string.h> 16 17 int main(void) 18 { 19 char str[11]; 20 char *pstr = "My name is fanmaolin"; 21 22 strncpy(str, pstr, 10); 23 printf("%s\n", str); 24 }结果:
[fanmaolin@Centeros str]$ gcc str.c [fanmaolin@Centeros str]$ ./a.out My name is@1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符) 如果n>src由于长度达到src NULL,正常复制,特别注意,如果src中有NULL,strncpy复制到NULL即使没到n也提前停止。如果n = src串长度,与strcpy一致。注意n的选择当n > dest串长度,dest栈空间溢出产生崩溃异常。 2)src串长度>dest串长度 如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest 最后一字符置为NULL。 综上,一般情况下,使用strncpy时,建议将n置为dest串长度(除非你将多个src串都复制到dest数组,并且从dest尾部反向操作),复制完毕后,为保险起见,将dest串最后一字符置NULL,避免发生输出乱码问题。当然喽,无论是strcpy还是strncpy,保证dest串容量(能容纳下src串)才是最重要的。
之前在做驱动的时候有用到strcmp,用来比较字符串大小
strcmp(const char *str1,const char * str2) 比较两个字符串 设这两个字符串为str1,str2, 若str1==str2,则返回零; 若str1< str2,则返回负数; 若str1> str2,则返回正数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。如: “A”<”B” “a”>”A” “computer”>”compare” 特别注意:strcmp(const char *str1,const char * str2)这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。
结果:
[fanmaolin@Centeros str]$ gcc str.c [fanmaolin@Centeros str]$ ./a.out str1 > str2需要注意的是str1和str2在strcmp函数中要求是指针类型,所以我用了“&”取地址符。
与strcmp类似 int strncmp ( const char * str1, const char * str2, size_t n ); str1, str2 为需要比较的两个字符串,n为要比较的字符的数目。 字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strncmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,直到字符结束标志’\0’,若差值不为0,则将差值返回。例如字符串”Ac”和”ba”比较则会返回字符”A”(65)和’b’(98)的差值(-33)。注意:要比较的字符包括字符串结束标志’\0’,而且一旦遇到’\0’就结束比较,无论n是多少,不再继续比较后边的字符。
【返回值】若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 若小于s2,则返回小于0的值。
原型:size_t strlen ( const char * str ); 计算字符串 str 的长度 说明:返回 str 的长度,不包括结束符NULL。(注意与 sizeof 的区别)
结果:
[fanmaolin@Centeros str]$ gcc strlen.c [fanmaolin@Centeros str]$ ./a.out 字符串长度为14size_t strnlen(const char *str, size_t maxlen);
计算字符串str的(unsigned int型)长度,不包括结束符NULL,该长度最大为maxlen。
我个人理解为: sizeof()求的是存储空间的大小 strlen()只是求字符串的长度 还有很多其他差别: 如strlen()是函数,sizeof()不是 sizeof()可以求函数空间大小等等 https://baike.baidu.com/item/strlen/2737?fr=aladdin
extern char *strcat(char *dest, const char *src);
把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0’)。 src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。
结果:
[fanmaolin@Centeros str]$ ./a.out My name is fanmaolinabsdjkabnsdkjachar * strncat(char *dest, const char *src, size_t n); dest指向目标字符串,src为指向源字符串。
把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的’\0’,从而实现字符串的连接。
头文件为 <memory.h>或<string.h>
void *memset(void *s, int ch, size_t n); 函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。 memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法,通常为新申请的内存做初始化工作
结果:
[fanmaolin@Centeros str]$ gcc memset.c [fanmaolin@Centeros str]$ ./a.out now the str is My name is fanmaolin now the str isvoid *memcpy(void *dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,函数返回指向dest的指针
还有很多字符串函数,有些功能会类似,在使用时重要的是灵活运用和熟练使用。
参考链接: http://www.cnblogs.com/xiangzi888/archive/2012/04/16/2451947.html
