【C语言】常用字符串函数及其模拟实现

简介: 🚀🚀前言大家好,本文主要深度讲解常用字符串函数的细节,并且模拟实现一遍,收录到C—语法专栏,定期更新C语言语法方面知识,都是比较详细的,自己复习的同时也希望能帮助到大家,如果有不对或者不足的地方欢迎评论区补充。

本章重点:

重点介绍常用处理字符串的库函数的使用以及注意事项,并且模拟实现,便于更深刻的理解下列函数。


strlen() 求字符串长度


strcpy() 复制字符串


strcmp() 比较两个字符串大小


strcat() 字符串拼接


strstr() 在其他字符串中查找是否有子串

一、strlen()

size_t strlen ( const char* str )


用于计算字符串长度


注意事项


字符串遇到 ‘ \0 ’ 结束,函数返回的长度不包括 ’ \0 ‘

注意传进来的字符串必须要以 ’ \0 ‘ 结尾否则直到在内存中遇到 ‘ \0 ’ 才会停止 ,相当于随机值

函数返回值是size_t

模拟实现🍉

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* pc)
{
  assert(pc);
  int count = 0;
  while (*pc++)    //遇到'\0'结束
  {
    count++;
  }
  return count;
}
int main()
{
  char c[] = "adfafds";
  printf("%d", my_strlen(c));   //7
  return 0;
}


a172dbca7da8483b89ffcfd6af7eaac9.png

二、strcpy()

char* strcpy(char* destination , const char* source)


用于拷贝一个字符数组或字符串到另一个字符数组里面


注意事项


源字符串必须要以 ’ \0 ‘ 结尾

目标空间必须足够大,否则会报错

目标空间不能为常量字符串,常量不能修改

拷贝的时候会把源字符串的 ‘ \0 ’ 也拷贝过去

🍎模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* s1,const char* s2)
{
  assert(s1&&s2);
  char* ret = s1;   //记录指针首地址
  while (*s1++ = *s2++);  //将字符串拷贝
  return ret;
}
int main()
{
  char s1[20] = "ahunb";
  char s2[] = "tiantianxiangshang"; 
  printf("%s", my_strcpy(s1, s2));  //tiantianxiangshang
} 


97fae2a26f1f457aaf4683cf2c2aa63d.png

三、strcmp()

int strcmp (const char* str1,const char* str2)


用于比较两个字符串大小(注意不是比较长短,而是逐个比较,一旦遇到不相等的就返回)


第一个字符串大于第二个字符串,则返回大于0的数字

第一个字符串等于第二个字符串,则返回0

第一个字符串小于第二个字符串,则返回小于0的数字

🥝模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* s1, const char* s2)
{
  assert(s1 && s2);
  while (*s1 == *s2)  //判断每个字符是否相等
  {
    if (*s1 == '\0' && *s2 == '\0')  //两个都到'\0'证明已经到字符串末尾了还没有不相等,则相等返回0
    {
      return 0;
    }
    s1++;
    s2++;
  }
  return *s1 - *s2;//如果不想打则跳出上面循环,返回*s1-*s2 ,S1如果比S2大返回的就是大于0的数,反之返回小于0的数
}
int main()
{
  char* s1 = "abbbcdefg";
  char* s2 = "abbcdefg";
  if (my_strcmp(s1, s2) > 0)
  {
    printf(">");
  }
  else if (my_strcmp(s1, s2) < 0)
  {
    printf("<");
  }
  else
  {
    printf("=");
  }
}

四、strcat()

char* strcat (char* destination,const char* source)

用于在一个字符串后面接上另一个字符串

注意事项

  • 源字符串必须以 ‘ \0 ’ 结束
  • 目标空间不能为常量字符串,因为常量字符串不能修改
  • 目标空间必须足够大,否则会报错

🍐模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* s1,char*s2)
{
  assert(s1 && s2);
  char* ret = s1;
  while (*s1)
  {
    s1++;     //先遍历到数组末尾
  }
  while (*s1++ = *s2++); //追加字符串直到'\0'
  return ret;
}
int main()
{
  char s1[20] = "hahaha";
  char s2[] = "haokaixin";
  printf("%s", my_strcat(s1, s2));
}


4fbf522a064a4dd3b9607777f49b81d2.png

五、strstr()

char* strstr(const char* str1,const char* str2)

查询第一个子串中有没有第二个字符串(是否包含第二个字符串)

🍈模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strstr(char* s1, char* s2)
{
  assert(s1 && s2);
  char* pstr1 = s1;
  char* pstr2 = NULL;
  char* cur = pstr1;  //指针当前位置
  while(*cur)
  {
    pstr1 = cur;
    pstr2 = s2;
    while (*pstr1 == *pstr2)
    {
      pstr1++;
      pstr2++;
      if (*pstr2 == '\0')   //如果pstr2是'\0'还没有跳出循环证明有子串
      {
        return cur;
      }
    }
    cur++;
  }
  return NULL;  //如果cur为’\0‘还没找到就返回空指针
}
int main()
{
  char s1[] = "haohaoxuexi";
  char s2[] = "hsaosdasfdi";
  printf("%s", my_strstr(s1, s2));
}

ea7ab46a21df4f28a037964009a79c46.png

完结

创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐



d89241b7267e47efa46e331647af0e19.gif































相关文章
|
1月前
|
C语言 C++
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
|
25天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
21 0
|
1月前
|
存储 安全 编译器
深入C语言库:字符与字符串函数模拟实现
深入C语言库:字符与字符串函数模拟实现
|
1月前
|
C语言
C语言常见字符函数和字符串函数精讲
C语言常见字符函数和字符串函数精讲
|
1月前
|
C语言
【C语言】模拟实现深入了解:字符串函数
【C语言】模拟实现深入了解:字符串函数
|
3月前
|
安全 程序员 C语言
【C语言】字符串函数及其模拟实现
【C语言】字符串函数及其模拟实现
|
3月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
62 0
|
3月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
55 0
|
4月前
|
存储 缓存 C语言
【C语言】字符函数,字符串函数,内存函数
C语言中的字符串函数和内存函数
54 0
【C语言】字符函数,字符串函数,内存函数
|
5月前
|
C语言
【c语言】字符串函数的模拟实现(二)
【c语言】字符串函数的模拟实现(二)
25 1