首页 > 其他分享 >C语言——字符串函数

C语言——字符串函数

时间:2024-11-13 12:51:19浏览次数:3  
标签:ch return 函数 C语言 char arr2 arr1 字符串 include

1. 字符分类函数 

2. 字符转换函数

3. strlen的使⽤和模拟实现

4. strcpy的使⽤和模拟实现

5. strcat的使⽤和模拟实现

6. strcmp的使⽤和模拟实现

7. strstr的使⽤和模拟实现

8. strtok函数的使⽤


接下来让我们一 一介绍每个函数的使用方法和如何模拟实现吧!!!

1  .C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

我就给大家介绍一下islower和isupper:

islower是判断这个字符是不是小写,如果是,那么为真;如果为大写,那么就为假

#include<stdio.h>
#include<ctype.h>
int main()
{
  char ch = 0;
  scanf("%c",&ch);
  if(islower(ch))//如果是小写字母,那么为真
  {
    printf("是小写字母");
  }
  else
  {
    printf("不是小写字母");
  }
  return 0;
}

isupper则是判断是否为大写字母,和islower相反

#include<stdio.h>
#include<ctype.h>
int main()
{
  char ch = 0;
  scanf("%c",&ch);
  if(isupper(ch))//如果是大写字母,那么为真
  {
    printf("是大写字母");
  }
  else
  {
    printf("不是大写字母");
  }
  return 0;
}

2. 字符转换函数

再C语言种提供了俩种字符转换函数,分别是tolower和toupper

tolower可以将大写字母转为小写字母

#include<stdio.h>
#include<ctype.h>
int main()
{
  char ch = 0;
  scanf("%c",&ch);
  if(isupper(ch))//如果是大写字母,则为真,进入if语句
  {
    ch = tolower(ch);//将大写字母转为小写字母
    printf("%c",ch);
  }
  else
  {
    printf("%c",ch);//不是大写字母,那么就是小写字母,直接打印
  }

  return 0;
}

toupper则是将小写字母转为大写字母,和tolower相反

#include<stdio.h>
#include<ctype.h>
int main()
{
  char ch = 0;
  scanf("%c",&ch);
  if(islower(ch))//如果是小写字母,则为真,进入if语句
  {
    ch = toupper(ch);//将小写字母转为大写字母
    printf("%c",ch);
  }
  else
  {
    printf("%c",ch);//不是小写字母,那么就是大写字母,直接打印
  }

  return 0;
}

当我们会使用前面介绍的字符函数,那么我们思考一下:能不能把一句话里面的小写字母全部转换为大写字母呢?如:I Like C -->I LIKE C

#include<stdio.h>
#include<ctype.h>
int main()
{
  char ch[20]="I Like C";
  size_t sz = sizeof(ch) / sizeof(ch[0]);
  char* p = ch;//把ch的首地址赋给指针p,因为下面for循环后,ch指向的地址就不再是首元素地址
  int i=0;
  for(i=0;i<sz;i++)
  {
    if(islower(ch[i]))
     {
        ch[i] = toupper(ch[i]);
     }
   }
     printf("%s",p);//刚开始我们让p记住了ch的首元素地址,所以用p的储存的首元素地址
                    //就可以顺藤摸瓜找到字符串后面所有的地址
  return 0;
}

3. strlen 的使⽤和模拟实现

   字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含      '\0' )。

   参数指向的字符串必须要以 '\0' 结束。

   注意函数的返回值为 size_t,是⽆符号的!!!无符号!!!!

接下来让我们来看看strlen是如何使用的吧!!!

#include<stdio.h>
#include<string.h>
int main()
{
  char arr1[]="abcdefg";
  char arr2[]="abcd";
  if(strlen(arr2)-strlen(arr1) > 0)//注意!!strlen是无符号
                         //所以即使4-7为负,但是strlen是为正
   {
      printf(">");
   }
   else
   {
      printf("<=");
   }
  return 0;
}

那让我们来模拟实现一下strlen函数吧!

#include<stdio.h>
#include<string.h>
int my_strlen(const char *arr)
{
  int count =0;//计数器,计算元素个数
  while(*arr!='\0')//如果arr找到'\0',则跳出循环
  {
     count ++;
     arr++;//让arr往后面走,直到找到'\0'
  }
  return count;

}
int main()
{
  char arr[]="abcdefgh";
  size_t len = my_strlen(arr);
  printf("%d\n",len);
  return 0;
}

4. strcpy 的使⽤和模拟实现

strcpy是一个拷贝字符串函数,它可以拷贝我们想要的内容,但是要注意以下几点;

1.源字符串必须以 '\0' 结束。

2.会将源字符串中的 '\0' 拷⻉到⽬标空间。

3.⽬标空间必须⾜够⼤,以确保能存放源字符串。

4.⽬标空间必须可修改。

#include<stdio.h>
#include<string.h>
int main()
{
  const char arr1[10]="abcdefg";//source源头字符数组
//我们不想让源头的内容被修改,所以加const限定
  char arr2[20]={0};//destination目标数组,想要拷贝到这个arr2数组
  strcpy(arr2,arr1);
  printf("%s\n",arr2);
  return 0;
}

当我们会使用strcpy字符串函数,那我们也来试试模拟实现这个函数吧!!

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* dest,const char*src)
{
   assert(dest && src!=NULL);
   char* r = dest;//先把dest的起始地址储存起来,方面最后打印
   while(*dest++ = *src++)//解引用的优先级高于++,所以会先复制,然后俩个指针再往后走
                          //与此同时,当遇到\0时,循环跳出,并且将\0复制给dest,非常巧妙!!
    {
       ;
    }
   return r;//因为我们刚开始有记录arr2的起始位置,所以直接返回r
            //如果不记录起始位置,那么再while循环中,arr2就会一直加加到后面的地址去
}
int main()
{
  const char arr1[10]="abcdefghi";
  char arr2[20]={0};
  my_strcpy(arr2,arr1);
  printf("%s\n",arr2);
  return 0;
}

5. strcat 的使⽤和模拟实现

在使用strcat时候,也要注意以下几点:

1.源字符串必须以 '\0' 结束。

2.⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

3.⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。

4.⽬标空间必须可修改。

strcat是追加字符,可以把我们想要追加的字符放在数组的后面,看看下面例子:

#include<stdio.h>
#include<string.h>
int main()
{
   char arr1[20]="Hello ";
   char arr2[10]="World";
//希望把world追加到Hello后面
   strcat(arr1,arr2);//arr1就是dest。arr2就是src
   printf("%s\n",arr1);
  return 0;
}

当我们会使用strcat时,那么我们也来尝试模拟这个有趣的函数!!

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* dest,const char* src)
{
   assert(dest && src !=NULL);
   char* r = dest;//先让r储存dest的起始位置
   while(*dest)
   {
      dest++;//这个循环是为了让dest找到\0,方便把src的字符追加到dest后面
   } 
 
   while(*dest++ = *src++)
   {
         ;
   }

   return r;//返回r储存dest的起始位置
} 
int main()
{
  char arr1[20]="Hello ";
  char arr2[20]="I like C";
  my_strcat(arr1,arr2);
  printf("%s\n",arr1);
  return 0;
}

6. strcmp 的使⽤和模拟实现

strcmp是比较俩个字符串的大小,但是不是比较谁的字符串长,而是一 一比较他们每个字符ASCII值的大小,最后得出哪个字符串大

#include<stdio.h>
#include<string.h>
int main()
{
   char arr1[10]="abcdefg";
   char arr2[10]="abq";
   int r = strcmp(arr1,arr2);//即使arr1的字符串比arr2长,但是比较的是他们每个元素的ASCII值
                            //因为q的ASCII大于c,所以字符串arr2大于arr1,返回 < 0
   printf("%d\n",r);
   return 0;
}

当我们会使用strcmp时,那就让我们来尝试模拟一下这个函数吧!!!

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* buf1,const char* buf2 )
{
  assert(buf1 && buf2 !=NULL);
  while(*buf1 == *buf2)//如果俩个字符相等,则进入循环,但是有俩种情况是相等的
                  //第一种:他们只是第一个或则第二个字符相等
                  //第二种:他们俩个字符串完全相等,并且都加加到\0
   {
      if(*buf1 == '\0')//这个就是属于第二种,他们俩个字符串如果都相等,那么随机一个都是\0
      {
         return 0;//返回0,因为俩个字符串相等
      }
     buf1++;
     buf2++;
   }

   if(*buf1 > *buf2)//如果不相等,跳出循环,在进一步判断哪个字符串大
    {
       return 1;
    }
    
    else
    {
       return -1;
    }
}


int main()
{
   char arr1[10]="abcdefghp";
   char arr2[10]="abcdf";
   int r = my_strcmp(arr1,arr2);
   printf("%d\n",r);
   return 0;
}

7. strstr 的使⽤和模拟实现

strstr作用是在字符串中找子串,如果找到了,则从子串的起始位置往后打印后面的字符

函数返回字符串str2在字符串str1中第⼀次出现的位置

字符 串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志

如果strstr函数找不到,则会返回空指针-NULL

#include<stdio.h>
#include<string.h>
int main()
{
   char arr1[]="abcdefghi";
   char* p = strstr(arr1,"bcd");//在arr1中找bcd字符串
//用指针p来接收strstr返回的地址
   printf("%s\n",p);
   return 0;
}

当我们会使用strstr函数时,那就让我们来尝试模拟实现这个有趣的函数!!

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strstr(const char* buf1,const char* buf2)
{
   assert(buf1 && buf2 !=NULL);
   char* cru = buf1;//让cru记住buf1的起始地址
   char* b1 = NULL;//让b1遍历buf1数组
   char* b2 = NULL;//让b2遍历buf2数组
   while(*cru != '\0')//如果*cru每次不为\0,则进循环
    {
        b1 = cru;//把cru的地址赋给b1,让b1去遍历buf1数组
        b2 = buf2;//把buf2地址赋给b2,让b2去遍历buf2数组
       while(b1 && b2 && *b1==*b2)//如果俩个数组字符相等,则每次b1和b2加加,找下一个字符
      {
          b1++;
          b2++;
      }
      if(*b2 == '\0')//如果跳出第二个while循环,就会判断一下b2是否指向\0
                    //如果b2已经指向\0,说明可以在buf1里面找到子串
       {      
            return (char*)cru;
       }
        cru++;//如果其中有一个字符不相等,则cru++,然后重新进第一个循环,在把cru赋给b1
              //让b1从cru++位置重新遍历数组
    }

  return NULL;//如果跳出第一个循环,说明buf1找到\0都没找到,说明找不到buf2这个子串
              //那么返回空指针
}


int main()
{
  char arr1[20]="abbbcdefg";
  char arr2[10]="bbc";
  char* p = my_strstr(arr1,arr2);
  if(p == NULL)
  {
     printf("找不到\n");
  }
  else
  {
     printf("找到了:%s\n",p);
  }
  return 0;
}

strstr字符串函数的模拟是不是有点难,我也是这么觉得,所以小伙伴们要多花点时间去理解里面的含义哦!!!

8. strtok 函数的使⽤

strtok是用来分割函数,提取字符串的函数,比较特别有意思

#include<stdio.h>
#include<string.h>
int main()
{
   const char arr1[20]="[email protected]";
   char arr2[]={0};
   strcpy(arr2,arr1);//把arr1的数组先复制到arr2,因为在切割时候会破环数组,防止破坏原数组
                     //所以要重新创建一个数组来储存原数组
   const char* p = "@.";//当遇到字符@和.时,就会切割字符,然后读取首元素地址,传给p
   char* r = NULL;//创建一个空指针r
   for(r = strtok(arr2,p);r != NULL;r = strtok(NULL,p))
//刚开始for循环,把strtok切割到的字符首元素地址传给r,如果有切割到,则传给r的就不是NULL
//那么循环继续,第二次strtok(NULL,p)就可以
//因为第二次strtok会利用NULL找到上一次切割的位置继续切割
    {
       printf("%s\n",r);
    }

   return 0;
}

标签:ch,return,函数,C语言,char,arr2,arr1,字符串,include
From: https://blog.csdn.net/CJH20050707/article/details/143703778

相关文章

  • C语言指针详解:用法与实例
    目录C语言指针详解:用法与实例引言1.指针基础1.1什么是指针?1.2如何声明指针?1.3获取变量的地址1.4解引用指针2.指针的高级用法2.1指针和数组2.2指针和函数参数2.3指针和动态内存分配3.指针的注意事项3.1空指针3.2悬空指针3.3指针运算C语言指针详......
  • 在Odoo开发中,ref是一个非常重要的函数,用于在XML文件中引用其他数据的ID,帮助我们快速定
    在Odoo开发中,ref是一个非常重要的函数,用于在XML文件中引用其他数据的ID,帮助我们快速定位和调用系统中已经存在的记录。ref的全称是reference,可以通过该函数引用特定的视图、字段、模型等元素,从而在模块开发中实现跨文件、跨模块的引用。下面我会详细解释ref的作用,并提供丰富的示例......
  • JSON 处理技术:字符串与对象的转换
    JSON处理技术:字符串与对象的转换在现代Web开发中,JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集。JSON格式易于人阅读和编写,同时也易于机器解析和生成。本文将探讨JSON.parse()和JSON.stringify()方法,这两个方法在处理JS......
  • T-SQL——自定义函数解析JSON字符串
    T-SQL——自定义函数解析JSON字符串适应于是2005及以上版本1.函数创建脚本CREATEFUNCTION[dbo].[parseJSON](@JSONNVARCHAR(MAX))/**Summary:>ThecodefortheJSONParser/ShredderwillruninSQLServer2005,andeveninSQLServer2000(withsomemo......
  • 可能是全网最详细的C语言函数全解析
    前言C语言中的函数是构建程序的基石,它就像一个个小工具,每个函数都有特定的功能,把这些小工具合理地组合起来就能构建出复杂而强大的程序。理解函数对于掌握C语言至关重要,这篇博客将详细介绍C语言函数的各个方面。一.函数的概念 1.定义   ①在C语言中,函数是......
  • C++常见函数的基础算法
    string字符串常用函数substring()string.length()&&string.size()string.find()string.replace()string.substr()string初始化和声明#include<bits/stdc++.h>usingnamespacestd; intmain(){stringstr1;//空字符串stringstr2="hello,w......
  • 痞子衡嵌入式:关于恩智浦SDK2.0里事务型中断处理函数(DriverIRQHandler)的重定向注意事
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是SDK2.0里事务型中断处理函数(DriverIRQHandler)的重定向注意事项。最近有一个i.MXRT客户在使用官方SDK外设驱动里的中断处理函数时遇到了代码重定向失效问题,客户用得是一个XIPFlash工程,想把程序中......
  • C语言——函数基本知识(三)
            上篇文章我们介绍了函数递归的使用,接下来我们再来讲解一些有关递归的习题。一.求n的阶乘    阶乘是指:n*(n-1)*(n-2)*······*2*1。    首先我们可以先利用循环实现上面的代码。代码如下:​intmain(){ intn=0; inta; intj=1......
  • 字符串搜索一把梭,hook libc.so系统库函数
    在安卓逆向过程,常常遇见一些加密字段没有写在java层,写在native层通过加密算法动态生成,但是只要是一个正常算法的生成,就一定会调用系统的库函数,故写了一段hook系统库函数的代码用于分析加密字符串的生成......
  • 字符串Java--- [蓝桥杯 2020 省 AB3] 日期识别
    题目描述小蓝要处理非常多的数据,其中有一些数据是日期。在小蓝处理的日期中有两种常用的形式:英文形式和数字形式。英文形式采用每个月的英文的前三个字母作为月份标识,后面跟两位数字表示日期,月份标识第一个字母大写,后两个字母小写,日期小于 1010 时要补前导 00。11 ......