【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现2

简介: 【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现

【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现1:https://developer.aliyun.com/article/1474749

运行代码图:

🌠strcmp 的使⽤

strcmp用于比较两个字符串是否相等,也就是比较字符串大小的函数。

函数原型:

int strcmp(const char *str1, const char *str2);
str1和str2是要比较的两个字符串指针。

strcmp比较字符串的大小,不是按字符串的长度进行比较,而是逐个字符地比较两个字符串对应的每个字符的ASCII码值。(比较使用的是无符号字符值的ASCII码顺序。)

  • 返回值:
  • 如果str1和str2完全相等,返回0。


如果str1大于str2(按ASCII码顺序),返回一个大于0的数。


如果str1小于str2,返回一个小于0的数。


strcmp()函数是C标准库string.h头文件中的函数。


字符串比较结束条件是遇到字符串末尾'\0'字符或者第一个不匹配

  • 字符。
字符串"cat" 和 "dog" 的比较:
'c'的ASCII码是99, 'd'的ASCII码是100,所以"cat"小于"dog"

字符串"hello" 和 "hello world" 的比较: 
前6个字符都相等,但第7个字符' '的ASCII码小于'\0',所以"hello"小于"hello world"

例子:

#include <string.h>

int main()
{
  char str1[] = "ahbyb";
  char str2[] = "asyzx";  

  int result = strcmp(str1, str2);

  if(result == 0)
    printf("Strings are equal\n");
  else if(result > 0)  
    printf("str1 is greater than str2\n"); 
  else
    printf("str1 is less than str2\n");

  return 0;
}

结果:

str1 is less than str2
• 1

🌉strcmp 模拟实现

int my_strcmp(const char* s1, const char* s2)
{
  while (*s1 == *s2)
  {
    if (*s1 == '\0')
      return 0;
    s1++;
    s2++;
  }
  return *s1 - *s2;
    //if (*s1 > *s2)
  //  return 1;
  //else
  //  return -1;

}

使用while循环逐个比较s1s2每个字符是否相等如果字符相等,继续循环比较下一个字符, 如果遇到字符串结束符’\0’,表示两个字符串完全匹配,直接返回0,如果在循环中找到不匹配的字符,使用*s1 - *s2返回两个字符的ASCII码差值

🌠 strstr 的使⽤

strstr用来查找一个字符串在另一个字符串中首次出现的位置。

strstr函数的原型:

char* strstr(const char* str1, const char* str2);
- str1: 主字符串,要在其中查找子字符串
- str2: 子字符串,要查找的字符串

strstr函数可以用来在一个字符串中查找另一个字符串首次出现的位置,如果str2不存在于str1中,则返回NULL;如果str2存在于str1中,则返回第一个匹配位置的指针。

strstr的比较原理是:

  1. str1字符串的起始位置开始,与str2字符串进行字符匹配比较。
  2. 如果匹配失败(当前字符不同),则str1指针后移一位,继续匹配。
  3. 如果匹配成功(到达str2字符串结束符'\0'),则匹配成功,返回str1指针地址。
  4. 如果遍历完str1仍未匹配成功,则返回NULL

例如:

char* p = strstr("hello world","world");
// p指向"world"子字符串在"hello world"中的位置

这里用一个图来解释strstr函数的工作原理:

        +----------------------+
str1 => | h e l l o   w o r l d| 
        +----------------------+
              |
              V
        +-----------+
str2 => | w o r l d |
        +-----------+
              |
              V
         比较第一个字符'h'与'w',不匹配
              |
              V
       指针后移到下一个字符'e'
              |
              V
         比较'e'与'w',不匹配
              |
              V
       指针后移到下一个字符'l'
              |  
              V
         比较'l'与'w',不匹配
              |
              V
       指针后移,依次比较直到匹配成功
              |
              V
         当str1指针指向'w'时,与str2第一个字符'w'匹配
              |
              V
       开始匹配后续字符,全部匹配成功
              |
              V
       返回str1指针地址,指向子字符串在主字符串中的位置

结果:

cegtbaab
• 1

当然也可以用图展示:

strstrstr1起始位置开始,用str2str1进行字符匹配比较。如果不匹配就后移str1指针,匹配成功就返回str1当前位置指针,上图就是返回c的地址。通过这种逐个匹配的方式找到子字符串在主字符串中的第一个匹配位置。

🌉strstr 的模拟实现

char* my_strstr(const char* str1, const char* str2)
{
  const char* cur = str1;//用cur记录str1的位置
  const char* s1 = NULL;//使用assert检查str1和str2是否为非空指针。
  const char* s2 = NULL;

  assert(str1 && str2);
  if (*str2 == '\0')//检查str2是否为空字符串,如果为空直接返回str1。
  {
    return (char*)str1;
  }

  while (*cur)//使用cur指针遍历str1。
  { //每次遍历:
    s1 = cur;//将cur赋值给s1,将str2赋值给s2,用于后续匹配
    s2 = str2;//当然,第几次失败后,重新回溯,重新开始匹配
    while (*s1 && *s2 && *s1 == *s2)
    {
      s1++;//开始匹配s1和s2中的字符,同时递增s1和s2。
      s2++;
    }
    if (*s2 == '\0')如果s1和s2匹配到结尾('\0'),表示找到了子串,返回cur。
    {
      return (char*)cur;
    }
    cur++;匹配失败后,cur++继续下次匹配。
  }
  return NULL;遍历完str1没有找到匹配,返回NULL。
}

时间复杂度为O(MN),其中M和N分别为主串和子串的长度。

若老铁们有点蒙蒙的,可以结合下图来理解:


🚩总结

这次阿森和你一起学习4个C语言中常用的基本字符操作函数,当然这只是一部分,还有很多,但阿森会慢慢和你一起学习。感谢你的收看,如果文章有错误,可以指出,我不胜感激,让我们一起学习交流,如果文章可以给你一个小小帮助,可以给博主点一个小小的赞😘

06B82E40-9B7C-40D3-9B22-A88277B789D7.gif

相关文章
|
2月前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
34 0
|
2月前
|
存储 安全 编译器
深入C语言库:字符与字符串函数模拟实现
深入C语言库:字符与字符串函数模拟实现
|
2月前
|
C语言
C语言常见字符函数和字符串函数精讲
C语言常见字符函数和字符串函数精讲
|
2月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
37 3
|
14天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
34 10
|
14天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
33 9
|
14天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
29 8
|
14天前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
32 6
|
14天前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
79 6
|
14天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
42 6