字符串函数

strstr

函数功能:在一字符串中查找指定的字符串)
头 文 件: #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
", str2);

输出:ven&GZ2075

strlen

函数功能:返回字符串长度,不包括''
头 文 件: #include <string.h>
定义函数: size_t strlen (const char *s);
参数分析:s --> 需要求长度的字符串,不包括结束字符""
返 回 值:返回字符串 s 的字符数

printf("%ld
", strlen("ven&GZ2075"));

输出:10

strtok

函数功能:分割字符串
头 文 件:#include <string.h>
定义函数:char * strtok(char *s, const char *delim);
参数分析:s --> 需要分割的字符串 delim --> 分割字符(用什么符号作为分割标记)可以有多个字符
返 回 值:成功 返回下一个分割后的字符串指针 如果已无从分割则返回 NULL

strcat,strncat

函数功能:连接两字符串,推荐使用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是为了存''
printf("%s
" , str); 

输出:HelloGZ    

注意:
1.无论如何字符串的末尾都应该以''结尾。
2.当参数1的可用空间存不下参数2时,会发生段错误。

strcpy / strncpy

函数功能:拷贝字符串
头 文 件:#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
" , str_1);
char * p = "GZ2075"; 
bzero(str, sizeof(str)); 
printf("str:%s
" , str);
strcpy(str_1 , p);      // 不会检查内存空间大小 
printf("str:%s
" , str_1);
// strncpy(str_1 , p , 32 ); // 控制拷贝的数据大小,在安全范围内 
printf("str+8:%s
",str_1+8);//发现strcpy纯粹覆盖内容并没有清空,strlen + 1  --> 跳过GZ2075  + 结束符 

输出:
str_1:Hello&Even&GZ2075
str:
str:GZ2075
str+8:en&GZ2075

strcmp

函数功能:字符串比较,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码的差值。

char *str1 = "AAAAA";
char *str12 = "AAA";
int result = strcmp(str1, str2); //注意是str1-str2,传入参数与顺序有关
printf("result = %d
", result);
printf("result = %c
", result);  //返回不同的第一个字母在ascii上的差值,

输出:
65
A

strchr

函数功能:查找字符串中第一个出现的指定字符
头 文 件: #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 
" , ret_val);

ret_val = strrchr(p1 , 'e'); // 从左往右寻找
printf("RetVal :%s 
" , ret_val);

输出:
RetVal :ello&Even
RetVal :en

注意

1.字符串函数传入的参数最好用字符数组定义,因为有些字符串处理函数,不允许传入字符指针;
2.字符串函数返回地址,应该用字符指针接收;
3.处理字符串时,要注意结尾是否加上了'',定义的字符数组的大小也应该能够容纳结束符''。

原文地址:https://www.cnblogs.com/ding-ding-light/p/14088767.html