C语言字符串篇——常用字符串函数介绍及模拟实现(上)

简介: 笔记

strlen函数


size_t strlen ( const char * str );


返回类型为size_t,参数类型为char *


注意事项:

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

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

3.注意函数的返回值为size_t,是无符号的( 易错 )

int main()
{
  char a[] = "123456";
  printf("%d",strlen(a));
  return 0;
}

1.png2.png

由于返回值是无符号整形,所以这里str2>str1,俩个无符号整形相加减结果还是无符号整形


strlen模拟

#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr)
{
  assert(arr != NULL);
  size_t a = 0;
  while (*arr++ != '\0')
  {
  a++;
  }
  return a;
}
int main()
{
  char arr[] = "abcde";
  size_t n = my_strlen(arr);
  printf("%d", n);
  return 0;
}

3.png

strcpy函数


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


用源里面的内容覆盖目标里面的内容 ,返回类型为char *,参数类型为char *,返回值为目标字符串(目标空间的起始地址)


注意事项:


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

会将源字符串中的 '\0' 拷贝到目标空间。

目标空间必须足够大,以确保能存放源字符串。

目标空间必须可变

4.png5.png


该函数在遇到源内容里面的\0时,会停止获取\0后面的字符,并将\0和\0之前的内容拷贝到目标地址里(这个是具有覆盖功能的)

6.png


这种情况下调试会报错,因为字符串常量不能被修改


strcpy模拟

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* des,const char* sour)
{
  assert(des&&sour);
  char* tmp = des;
  while (*des++ = *sour++)
  {
  ;
  }
  return tmp;
}
int main()
{
  char arr1[] = "abcdef";
  char arr2[20] = {0};
  my_strcpy(arr2,arr1);
  printf("%s", arr2);
  return 0;
}

7.png


strcat函数


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


返回值为目标空间的起始地址,返回类型为char *,参数类型为char * ,该函数为字符串追加函数


注意事项:

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

目标空间必须有足够的大,能容纳下源字符串的内容。

目标空间必须可修改。


8.png

这个在追加时,遇到源字符串里的\0,会将\0和\0之前的字符追加到目标字符串里


strcat模拟


9.png

#include<stdio.h>
#include<assert.h>
char* my_strcat(char *dest,const char *sorc)
{
  assert(dest && sorc);
  char* tmp = dest;
  while (*dest != '\0')
  {
  dest++;
  }//找到目标字符串里的\0
  while (*dest++ = *sorc++)
  {
  ;
  }
  return tmp;
}
int main()
{
  char arr1[20] = "hello ";
     my_strcat(arr1,"world");
  printf("%s", arr1);
  return 0;
}


strcat函数能否自我追加

10.png

答案是不行,原因如下:

11.png


strcmp函数


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


返回类型为int,参数为char *

12.png



str1


str1=str2,返回0


str1>str2,返回大于0的数

13.png

这个函数是如何进行比较的?

14.png

a和a比较,ASCII码值相等,然后比较下一个字符


b和b比较,ASCII码值相等,然后比较下一个字符


c和c比较,ASCII码值相等,然后比较下一个字符


d和\0比较,d的ASCII码值大于\0的ASCII码值,然后返回一个>0的数字


注意:strcmp是从放第一个字符开始比较ASCII码值,若不相等,则会结束,strcmp不是比较字符串长度的




模拟实现strcmp函数

#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* arr1, const char* arr2)
{
  assert(arr1 && arr2);
  while (*arr1!='\0'&& * arr1 == *arr2)
  {
  arr1++;
  arr2++;
  }
  return (*arr1 - *arr2);
}
int main()
{
  char arr1[] = "abc";
  char arr2[] = "abcdefg";
  int c=my_strcmp(arr1, arr2);
  if (c > 0)
  printf(">");
  else if (c == 0)
  printf("=");
  else
  printf("<");
  return 0;
}


15.png

strncpy函数


char * strncpy ( char * destination, const char * source, size_t num );


跟strcpy一样,只不过多了一个参数,返回值类型为 char *,返回值为目标起始地址


,这个参数是用来限制拷贝字节数的。

16.png17.png

拷贝过程中,若遇到\0,则会跟\0一起拷贝过去

18.png

如果拷贝的时候,源字符串个数不够,则会补充\0


strncat函数


char * strncat ( char * destination, const char * source, size_t num );


返回值类型为char *,返回值为目标首地址,与strcat相比,多了一个参数,这个参数是用来限制被追加的字节数的

19.png20.png


通过这个,我们可以看到在追加结束时,函数会自动补一个\0


strnmcp函数


int strncmp ( const char * str1, const char * str2, size_t num );


返回值类型为int,多了一个参数,这个参数是用来限制str2的字节个数的,这个函数也是比较ASCII码值,而不是比较字符串长度

21.png

这里值比较了arr2的前三个字符


strstr函数(查找子串函数)


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

22.png

返回值为类型为char *,参数类型为char *


这是查找str1里面有没有出现str2这个字符串,str2作为字串,如果在str1里面找到了子串,则返回子串在母串里的第一个字符的地址,如果没有找到子串,则返回空指针NULL

23.png24.png25.png

这里我们可以看到,返回的是子串在母串中的起始位置  

strstr函数模拟实现

char* my_strstr(const char* str1, const char* str2)
{
  assert(str1 && str2);
  char* s1 = str1;
  char* s2 = str2;
  char* p = str1;
  while (*p)
  {
  s1 = p;
  s2 = str2;
  while (*s1 == *s2&&*s1!='\0'&&*s2!='\0')
  {
    s1++;
    s2++;
  }
  if (*s2 == '\0')
    return p;
  p++;
  }
  return NULL;
}
int main()
{
  char str1[] = "132456879";
  char str2[] = "56";
  char *ret=my_strstr(str1, str2);
  printf("%s", ret);
  return 0;
}

26.png

目录
打赏
0
0
0
0
1
分享
相关文章
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
127 10
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
248 4
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
89 0
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
167 8
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
362 7
深入C语言库:字符与字符串函数模拟实现
深入C语言库:字符与字符串函数模拟实现
C语言常见字符函数和字符串函数精讲
C语言常见字符函数和字符串函数精讲
|
5月前
|
【C语言】模拟实现深入了解:字符串函数
【C语言】模拟实现深入了解:字符串函数
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
139 23
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等