第一阶段14 C语言字符串函数

加入CSDN是出于记录,希望有不足之处多加指正。

1、strstr(在一字符串中查找指定的字符串)

//ubuntu查找
$ man strstr  
NAME
       strstr, strcasestr - locate a substring

SYNOPSIS
      //头文件
       #include <string.h>   
      //定义函数
       char *strstr(const char *haystack, const char *needle);
      参数分析:
          haystack-->需要搜索的字符串(被)
          needle  -->需要搜索在内容(要)
       #define _GNU_SOURCE         /* See feature_test_macros(7) */

       #include <string.h>

       char *strcasestr(const char *haystack, const char *needle);

DESCRIPTION
       The  strstr() function finds the first occurrence of the substring nee‐
       dle in the string haystack.  The terminating null bytes ('\0') are  not
RETURN VALUE(返回值)
       These functions return a pointer to the beginning of the  located  sub‐
       string, or NULL if the substring is not found.
      成功:返回找到的起始地址
      失败:返回 NULL 0

实例代码:

char * ch1 = "hello.mp3";
char * ch2 = ".c";

char * p = strstr(ch1 ,ch2) ; //在ch1 中搜索 ch2
if(NULL == p)
{
   printf("文件[%s]不是一个c源文件!\n",ch1);
}
else
{
   printf("文件[%s]是一个c源文件!\n",ch1);
}

2、strlen

strlen (返回字符串长度,直到遇到结束符为止)
头文件:
      #include <string.h>
定义函数:
      size_t strlen (const char *s);
参数分析:
      s--> 需要计算的字符串
返回值:
      返回字符串的长度,不包括"\0"

实例代码:

char buf[100] = {"hello Even"};
buf[5] = '\0'; //故意在字符串中间增加一个结束符,会导致strlen计算到当前位置就结束
printf("strlen(buf):%ld\n", strlen(buf)); //计算数组中字符串的长度
printf("sizeof(buf):%ld\n". sizeof(buf)); //计算数组的大小

printf("buf:%s\n", buf); // %s 将会打印字符串直到遇到结束符为止
printf("buf+6:%s \n", buf+6); //偏移到第一个结束符后面开始打印输出

3、strtok

strtok (分割字符串)
   头文件:
      #include <string.h>
   定义函数:
      char * strtok(char *s ,const char *delim);
   参数分析:
      s --> 需要分割的字符串指针
      delim --> 分割符号,可以有多个
   返回值:
      成功,下一个分割后的字符串指针
      失败,返回 NULL

实例代码

char buf [100] = {"hello world,one-1"};
char * p = " ,-";  //定义了多个分隔符

char * str = strtok (buf , p); // 第一次调用strtok 必须给第一个参数
printf("%s\n" , str);

while(str = strtok(NULL , P))  //后面就不需要给第一个参数 写NULL
{
   printf("%s\n ", str);
}

注意:
由strtok 的工作原理得知(该函数需要把分隔符替换成结束符),字符串 s 必须是可以被修改的。

4、strcat/strncat

strcat(连接两字符串)
头文件:
   #include <string.h>
定义函数:
   char * strcat(char *dest , const char *src);
参数分析:
   dest --> 需要拼接到该参数后面,该参数所指向的内存必须可以被修改
   src --> 需要拼接的内容
返回值:
   参数 dest 的字符串起始地址
strncat (连接两字符串,安全版本)
头文件:
   #include <string.h>
定义函数:
   char * strncat(char * dest, const char *src,size_t n);
参数分析:
   dest -->需要拼接到该参数后面,该参数所指向的内存必须可以被修改
   src --> 需要拼接的内容
   n --> 需要拷贝的字符长度
返回值:
   参数 dest 的字符串起始地址   
      

实例代码

char buf [100] = {"hello world,one-1"};
char * p = " ,-*abcd";

strcat(buf, p); //不推荐使用
strncat(buf, p); //推荐使用,数组长度-字符串长度 =  剩余空间
printf("buf:%s\n", buf);

5、strcpy/strncpy

strcpy (拷贝字符串)
头文件:
   #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 buf [100] = {"hello world,one-1"};
printf();
strcpy(buf , "hell world 123");
printf("%s\n" , buf);
printf("%s\n" , buf+(strlen(buf)+1)); //strlen 求得长度不包括结束符 +1
        //strcpy 只是单纯的覆盖原来地址的内容,并不会清空其他内容
char * str = malloc(5); //str 指向堆空间
//str = "hell world 123"; //str 指向数据段中的"hell world 123"
strcpy(str , "hell world 123"); //不推荐使用, 内存大小可能造成段错误
strncpy(str , "hell world 123", 5); // 推荐使用,根据用户的需求来决定拷贝内容的长度

注意:

  • strcpy 只是单纯的覆盖目标地址内容,并不会修改/清空原本地值
  • 一般用于给数组赋予/堆空间赋值

6、strcmp

strcmp (比较两个字符串);
头文件:
   #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--> 需要比较字符串2
   n --> 需要比较前 n 字符
返回值:
   成功:返回 0 表示两个字符串相等
   失败:返回非 0 值,表示两个字符串之间的差值
         小于零 表示s1的第一个差异字符比较小 (ASCII值)
         大于零 表示s1的第一个差异字符比较小 (ASCII值)

实例代码

int ret_val = 0; //定义查值初始化为0
char * str1 = "hello one";
char * str2 = "hello two";

printf("str1:%p\t str2:%p\n" ,str1 , str2);
if(ret_val = strcmp(str1, str2)) //比较完整的两个字符串
{
   printf("两个字符串不相等!! 差值为:%d \n", ret_val);
}
else
{
   printf("两个字符串相等!! 差值为:%d \n", ret_val);
}
if(ret_val =  strncmp (str1 ,str2 ,5)) //比较两个字符串的前5字节
{
   printf("两个字符串前5字节不相等!! 差值为:%d \n", ret_val);
}
else
{
   printf("两个字符串前5字节相等!! 差值为:%d \n", ret_val);
}

7、strchr / strrchr

strchr (查找字符串中第一个出现的指定字符,从左往右 / R 从右往左)
头文件:
   #include  <string.h>
定义函数:
   char * strrchr (const char *s ,int c);  //从右往左
    char * strchr (const char *s ,int c);  //从左往右
 参数分析:
    s --> 需要查找的字符串(被动)
    c --> 需要寻找的字符串
 返回值:
     如果找到指定的字符串,则返回该字符所在地址。
     否则返回 0

实例代码:

int ret_val= 0;
char * str1 = "hello one"
char chr = 'e';
char *p = NULL;

P = strchr(str , chr ); //从左往右
printf("p:%p\n" , p);
//p:0x7f2d76c007f5

P = strrchr(str , chr ); //从右往左
printf("p:%p\n" , p);
//p:0x7f2d76c007fc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值