常见字符串函数的学习总结

来源:互联网 发布:淘宝号申请日期怎么看 编辑:程序博客网 时间:2024/05/22 07:40

在之前获取IP地址中,自己稍微总结了一部分,但是书到用时方恨少,今天就把自己经常用到的字符串函数整理一遍。

str系列

头文件#include <string.h>

strstr

函数功能

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

实例

1 /*********************************************************************************  2  *      Copyright:  (C) 2017 fanmaolin<fanmaolinn@gmail.com>  3  *                  All rights reserved.  4  *  5  *       Filename:  strstr.c  6  *    Description:  This file   7  *                   8  *        Version:  1.0.0(08/04/2017)  9  *         Author:  fanmaolin <fanmaolinn@gmail.com> 10  *      ChangeLog:  1, Release initial version on "08/04/2017 09:17:39 PM" 11  *                  12  ********************************************************************************/ 13  14 #include <stdio.h> 15 #include <string.h> 16  17 int main(void) 18 { 19     char str[] = "My name is fanmaolin"; 20     char *pstr; 21  22     pstr = strstr(str, "fanmaolin"); 23     printf("the string %s here\n", pstr); 24 }

编译后
这里写图片描述

strchr

函数功能

原型为extern char *strchr(const char *s,char c)可以查找字符串s中首次出现字符c的位置。成功则返回要查找字符第一次出现的位置,失败返回NULL

实例

14 #include <stdio.h> 15 #include <string.h> 16  17 int main(void) 18 { 19     char str[] = "My name is fanmaolin"; 20     char *pch = NULL; 21  22     pch = strchr(str, 'a'); 23     printf("find it at %d\n", pch - str + 1); 24  25  26 }

结果:
这里写图片描述

strcpy

函数功能

原型声明:char *strcpy(char* dest, const char *src);
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
常用于字符串赋值

实例

14 #include <stdio.h> 15 #include <string.h> 16                    17 int main(void)     18 {                  19     char str[100]; 20     char *pstr = "My name is fanmaolin"; 21                    22     strcpy(str, pstr); 23     printf("%s\n", str); 24 }                 

结果:

[fanmaolin@Centeros str]$ gcc str.c [fanmaolin@Centeros str]$ ./a.out My name is fanmaolin

strncpy

函数功能

和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,用来比较字符串大小

函数功能

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)这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。

实例:

14 #include <stdio.h> 15 #include <string.h> 16  17 int main(void) 18 { 19     char str1 = 'a'; 20     char str2 = 'A'; 21     int s = 0; 22  23     s = strcmp(&str1, &str2); 24  25     if(s > 0) 26     { 27         printf("str1 > str2\n"); 28     } 29    else if(s == 0) 30     { 31         printf("str1 == str2\n"); 32     } 33     else 34     { 35         printf("str1 < str2\n"); 36     } 37  38 }

结果:

[fanmaolin@Centeros str]$ gcc str.c  [fanmaolin@Centeros str]$ ./a.out   str1 > str2

需要注意的是str1和str2在strcmp函数中要求是指针类型,所以我用了“&”取地址符。

strncmp

与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的值。

strlen

函数功能

原型:size_t strlen ( const char * str );
计算字符串 str 的长度
说明:返回 str 的长度,不包括结束符NULL。(注意与 sizeof 的区别)

实例

14 #include <stdio.h> 15 #include <string.h>            16                                17 int main(void)                 18 {                              19     char *str = "absdjkabnsdkja"; 20     int len = 0;               21     len = strlen(str);         22     printf("字符串长度为%d\n", len); 23 }              

结果:

[fanmaolin@Centeros str]$ gcc strlen.c [fanmaolin@Centeros str]$ ./a.out      字符串长度为14

strnlen

size_t strnlen(const char *str, size_t maxlen);

计算字符串str的(unsigned int型)长度,不包括结束符NULL,该长度最大为maxlen。

sizeof()与strlen()区别简析

我个人理解为:
sizeof()求的是存储空间的大小
strlen()只是求字符串的长度
还有很多其他差别:
如strlen()是函数,sizeof()不是
sizeof()可以求函数空间大小等等
https://baike.baidu.com/item/strlen/2737?fr=aladdin

strcat

函数功能

extern char *strcat(char *dest, const char *src);

把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0’)。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。

实例

14 #include <stdio.h> 15 #include <string.h> 16                    17 int main(void)     18 {                  19     char *str1 = "absdjkabnsdkja"; 20     char str2[100] = "My name is fanmaolin"; 21                    22     strcat(&str2, str1); 23                    24     printf("%s\n", str2); 25 }         

结果:

[fanmaolin@Centeros str]$ ./a.out My name is fanmaolinabsdjkabnsdkja

strncat

函数功能

char * strncat(char *dest, const char *src, size_t n);
dest指向目标字符串,src为指向源字符串。

把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的’\0’,从而实现字符串的连接。

mem系列

头文件为
<memory.h>或<string.h>

memset

功能介绍

void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法,通常为新申请的内存做初始化工作

实例

14 #include <stdio.h>                                                                                                                      15 #include <memory.h> 16  17 int main(void) 18 { 19     char str[] = "My name is fanmaolin"; 20     printf("now the str is %s\n", str); 21     memset(str, 0 ,sizeof(str)); 22     printf("now the str is %s\n", str); 23 }

结果:

[fanmaolin@Centeros str]$ gcc memset.c     [fanmaolin@Centeros str]$ ./a.out      now the str is My name is fanmaolinnow the str is 

memcpy

函数功能

void *memcpy(void *dest, const void *src, size_t n);
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,函数返回指向dest的指针

总结:

还有很多字符串函数,有些功能会类似,在使用时重要的是灵活运用和熟练使用。

参考链接:
http://www.cnblogs.com/xiangzi888/archive/2012/04/16/2451947.html

原创粉丝点击