模拟实现strstr、strchr、strcmp

本文详细介绍了如何模拟实现C语言中的字符串函数:strstr用于查找字符串str1中是否包含str2,strchr用于在字符串中查找特定字符,strcmp用于按字典序比较两个字符串的大小。通过解题思路和实现代码,帮助读者理解这些函数的工作原理。
摘要由CSDN通过智能技术生成

【1、问题描述】:

模拟实现strstr,在字符串str1的中查找是否包含字符串str2。

【解题思路】:
在这里插入图片描述
1、创建两个指针char* ptr1和char* ptr2分别指向str1和str2两个字符串的首位字符,再创建一个指针char* red_ptr1指向ptr1的位置。

2、当red_ptr1指向元素等于ptr2指向元素时,这两个指针一同往后移,前提是这两个指针指向的位置都不是\0。

3、如果ptr2指向\0时,说明str2已经遍历完了,在str1中找到了str2这个子串,返回ptr1的值。

4、如果red_ptr1指向元素不等于ptr2指向元素时,ptr1后移一位,ptr2回到首位置,red_ptr1回到ptr1的位置,重新比较。直到ptr1指向了\0,那么我们就可以得知str1中不包含str2。

【实现代码】

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* Strstr(const char* str1, const char* str2) {
  assert(str1 != NULL);
  assert(str2 != NULL);
  if (*str2 == '\0') {
   return NULL;
  }
  char* ptr1 = str1;//记录从哪个位置找字符串子串
  while (*ptr1 != '\0') {
   char* red_ptr1 = ptr1;//用来完成具体的与str2中字符串的比较
   char* ptr2 = str2;//完成具体的str2中字符比较过程
   while (*red_ptr1 != '\0'&&*ptr2 != '\0'&&*red_ptr1 == *ptr2) {
    ++ptr2;
    ++red_ptr1;
   }
   if (*ptr2 == '\0') {
    return ptr1;
   }
   if (*ptr2 != *red_ptr1) {
    ++ptr1;
   }
 }
  if (*ptr1 == '\0') {
   return NULL;
  }
}
int main() {
  char str1[] = "ababcde";
  char str2[] = "abc";
  //ret指向了str1中第一处str2子串的位置
  char* ret = Strstr(str1, str2);
  printf("%p\n", ret);
  printf("%p\n", str1);
  printf("%d\n", ret - str1);
  system("pause");
  return 0;
}

【运行结果】
在这里插入图片描述
【2、问题描述】

模拟实现strchr,在一个字符串中查找一个字符,并返回该字符在字符串中的位置。

【解题思路】

这个问题比较简单,遍历str中的所有字符,当与要查找字符相等时,返回相对应的下标即可。

【实现代码】

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* Strchr(const char* str, int character) {
  assert(str != NULL);
  for (; *str != '\0'; ++str) {
   if (*str == (char)character)
    return str;
  }
  if (*str == '\0') {
   return NULL;
  }
}
int main() {
  char str[] = "hello world";
  char* pch;
  printf("查找'l'符号在字符串\%s中 \n", str);
  pch = Strchr(str, 'l');
  while (pch != NULL) {
   printf("found at %d\n", pch - str + 1);
   pch = Strchr((pch + 1), 'l');
  }
  system("pause");
  return 0;
}

【运行结果】
在这里插入图片描述
【3、问题描述】

模拟实现strcmp,按字典序的方式比较两个字符串的大小。

【功能要求】

1、按字典序方式比较两个字符串大小。

2、若第一个字符串大于第二个字符串,返回1。第一个字符串等于第二个字符串,返回0,否则返回-1。

【实现代码】

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int Strcmp(const char* str1, const char* str2) {
  assert(str1 != NULL);
  assert(str2 != NULL);
  int i = 0;
  for (; str1[i] != '\0'&&str2[i] != '\0'; ++i) {
   if (str1[i] > str2[i]) {
    return 1;
   }
   else if (str1[i] < str2[i]) {
    return -1;
   }
   else if (str1[i] == str2[i]);//注意此时并没有比较完,不可以直接返回0,所以直接写一个;
  }
  if (str1[i] < str2[i]) {
   return -1;
  }
  if (str1[i] > str2[i]) {
   return 1;
  }
  else {
   return 0;
  }
}
int main() {
  char str1[1024] = "abcd";
  char str2[1024] = "bb";
  int ret = Strcmp(str1, str2);
  if (ret > 0) {
   printf("str1>str2\n");
  }
  else if (ret < 0) {
   printf("str1<str2\n");
  }
  else if (ret == 0) {
   printf("str1=str2\n");
  }
  system("pause");
  return 0;
}

【运行结果】
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值