函数功能:在一字符串中查找指定的字符串)
头 文 件: #include <string.h>
定义函数: char *strstr(const char *haystack, const char * needle);
参数分析:haystack --> 须要搜查的字符串 (被动 家里)
needle --> 须要查找的内容 (主动 毒品)
返 回 值:成功 返回指定字符串第一次出现的地址 失败 返回 0数组
char str1[] = "Hello Even&GZ2075"; char *str2; str2 = strstr(str1, "ven"); printf("%s\n", str3); 输出:ven&GZ2075
函数功能:返回字符串长度,不包括'\0'
头 文 件: #include <string.h>
定义函数: size_t strlen (const char *s);
参数分析:s --> 须要求长度的字符串,不包括结束字符"\0"
返 回 值:返回字符串 s 的字符数安全
printf("%ld\n", strlen("ven&GZ2075")); 输出:10
函数功能:分割字符串
头 文 件:#include <string.h>
定义函数:char * strtok(char *s, const char *delim);
参数分析:s --> 须要分割的字符串 delim --> 分割字符(用什么符号做为分割标记)能够有多个字符
返 回 值:成功 返回下一个分割后的字符串指针 若是已无从分割则返回 NULL函数
函数功能:链接两字符串,推荐使用strncat能够控制拼接的长度,避免越界/非法访问。
头 文 件: #include <string.h>
定义函数: char *strcat (char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
参数分析:dest --> 目标地址 src --> 须要拷贝的字符串 n --> 指望链接的长度
返 回 值:返回参数 dest 的字符串起始地址指针
char str[8] = "Hello" ;//指针STR 指向数据段中的常量区 char * p ="GZ2075"; strncat(str , p , sizeof(str)-strlen(str)-1); //能够使用 = 数组大小-实际已经使用的-1,-1是为了存'\0' printf("%s\n" , str); 输出:HelloGZ
注意:
不管如何字符串的末尾都应该以'\0'结尾。code
函数功能:拷贝字符串
头 文 件:#include <string.h>
定义函数:char *strcpy(char *dest, const char *src);
char * strncpy(char *dest, const char *src, size_t n);
参数分析:dest --> 目标地址 src --> 须要拷贝的字符串的路径 n --> 指望拷贝的数大小
返 回 值:成功 返回参数 dest 的字符串起始地址内存
char str[32] = "Hello&Even&GZ2075" ; // 指针STR 指向数据段中的常量区 char * str_1 = calloc( 1 , 32 ); //str_1="Hello&Even&GZ2075"; // 错误,语法没问题,可是逻辑上不对,当前改变了STR1的指向 堆内存的入口地址被你搞丢了 strncpy(str_1,"Hello&Even&GZ2075",32 );//把"Hello&Even&GZ2075" 拷贝到str_1中(堆空间) printf("str_1:%s\n" , str_1); char * p = "GZ2075"; bzero(str, sizeof(str)); printf("str:%s\n" , str); strcpy(str_1 , p); // 不会检查内存空间大小 printf("str:%s\n" , str_1); // strncpy(str_1 , p , 32 ); // 控制拷贝的数据大小,在安全范围内 printf("str+8:%s\n",str_1+8);//发现strcpy纯粹覆盖内容并无清空,strlen + 1 --> 跳过GZ2075 + 结束符 输出: str_1:Hello&Even&GZ2075 str: str:GZ2075 str+8:en&GZ2075
函数功能:字符串比较,strncmp会顺便清空后面的内容。加入实际数据只有8字节而n是32,则会把8字节后的数据清空为 0
头 文 件:#include <string.h>
定义函数:int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
参数分析:s1 --> 须要比较的字符串1 s2 --> 须要比较的字符串1 n --> 须要比较的前N个字符
返 回 值:返回 0 表示两个字符串相等, 返回 非零 表示两个字符串不一样,返回值为第一个不一样首字母的ASCII码的差值。ci
char *str1 = "AAAAA"; char *str12 = "AAA"; int result = strcmp(str1, str2); //注意是str1-str2,传入参数与顺序有关 printf("result = %d\n", result); printf("result = %c\n", result); //返回不一样的第一个字母在ascii上的差值, 输出: 65 A
函数功能:查找字符串中第一个出现的指定字符
头 文 件: #include <string.h>
定义函数: char * strchr (const char *s, int c); // 从左往右
char * strrchr (const char *s, int c); // 从右往左
参数分析: s --> 须要查找的字符串 c --> 须要查找的字符(unsigned char )
返 回 值: 成功 返回第一次出现的位置的地址 失败 返回 0字符串
char p1[] = "Hello&Even"; char * ret_val = strchr(p1 , 'e'); // 从左往右寻找 printf("RetVal :%s \n" , ret_val); ret_val = strrchr(p1 , 'e'); // 从左往右寻找 printf("RetVal :%s \n" , ret_val); 输出: RetVal :ello&Even RetVal :en
1.字符串函数传入的参数最好用字符数组定义,由于有些字符串处理函数,不容许传入字符指针;
2.字符串函数返回地址,应该用字符指针接收;
3.处理字符串时,要注意结尾是否加上了'\0',定义的字符数组的大小也应该可以容纳结束符'\0'。字符串处理