一篇文章让你看懂C语言字符函数和内存函数(上)

简介: 一篇文章让你看懂C语言字符函数和内存函数(上)

一、字符函数


1.strlen函数


520a8a2c43814b378cee0fd76aa0a3b6.png


1.1strlen函数的介绍


strlen函数的作用:得到一个 字符串的长度

通过查询我们看到strlen函数的定义:参数为const修饰的指针,返回类型为size_t。


注意:

1. strlen函数的返回类型为size_t(无符号整形)

int main()
{
  if (strlen("abc") - strlen("abcdef") > 0)
  {
    printf("大于\n");
  }
  else
  {
    printf("小于等于\n");
  }
  return 0;
}


50518118ad524add9135a2157a76c9d2.png

为什么是大于呢?


-3

原码:1000 0000 0000 0000 0000 0000 0000 0011

反码:1111 1111 1111 1111 1111 1111 1111 1100

补码:1111 1111 1111 1111 1111 1111 1111 1101

因为是无符号数最高位就不是符号为是一个大于零数所以打印结果为大于


2.所求字符串必须是以'\0'结尾

int main()
{
  char arr[5] = { 'a','b','c','d','e' };
  printf("%d \n", strlen(arr));
  return 0;
}


eaf5039568fd4f00a555e037056739dd.png


1.2strle函数的使用


int main()
{
  char arr[] = "hello world";
  printf("%d\n", strlen(arr));
  return 0;
}


419e2beb780a481d8fd69fdaaa88a378.png


1.3模拟实现strlen


这里提供三种方法给大家参考


1.3.1指针移动法

size_t my_strlen(char* str) 
{
  int num = 0;
  while (*str != 0)
  {
    str++;
    num++;
  }
  return num;
}
int main()
{
  size_t ret = my_strlen("abcdef");
  printf("%d\n", ret);
  return 0;
}


fc56c95916fb46aaa9f617d43834e2f1.png


1.3.2指针减去指针法


size_t my_strlen(char* str)
{
  char* p = str;
  while (*str != '\0')
  {
    str++;
  }
  return str - p;
}
int main()
{
  size_t ret = my_strlen("abcdef");
  printf("%d\n", ret);
  return 0;
}


79b53799f42a4f84aef1619bcd193e68.png


1.3.3函数递归法


size_t my_strlen(char* str)
{
  if (*str == 0)
  {
    return 0;
  }
  else
  {
    str++;
    return 1 + my_strlen(str);
  }
}
int main()
{
  size_t ret = my_strlen("abcdef");
  printf("%d \n", ret);
  return 0;
}


04f9275550444afa8b5120490c3be915.png


2.strcpy函数


abed2d84f9b244339b5cf681efcb7651.png

 2.1strcpy函数的介绍


strcpy函数的作用:将一个字符串拷贝到另外一个字符串中

通过查询我们可知:strcpy函数的返回类型为char *,第一个参数为 char *destination (目标字符串指针),第二个参数为 char * source(被拷贝字符串的指针)

注意:

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

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

3.目标空间必须走勾搭,以确保能存放源字符串

4.目标空间必须可变。


2.2strcpy函数的使用


int main()
{
  char arr1[] = "xxxxxxxxxxxxxxx";
  printf("arr1拷贝前:%s \n",arr1);
  char arr2[10] = "abcdefgh";
  char* ret = strcpy(arr1, arr2);
  printf("\narr1拷贝后: %s \n", ret);
  return 0;
}


545f03e1cffb4701884e9763f9c0c09f.png


2.3模拟实现strcpy


char* my_strcpy(char* str2,const char* str1)
{
  assert(*str1 && *str2);
  char* ret = str2;
  while (*str1) 
  {
    *str2 = *str1;
    str1++;
    str2++;
  }
  *str2 = *str1;  
    //源字符串 '\0'的打印
  while (*str2++ = *str1++)
  {
    ;
  }
  return ret;
}
int main()
{
  char arr1[20] = "abcdef";
  char arr2[] = "xxxxxxxxxx";
    //目标空间必须可变
  printf("arr2数组copy前:%s\n", arr2);
  char *p=my_strcpy(arr2, arr1);
  printf("arr2数组copy后:%s\n",p);
  return 0;
}


da8f43fb030e421ca4f361c71abdcc09.png


3.strcat函数


94febc113c4a431da706eda37400628f.png


3.1strcat函数的介绍


strcat函数的作用:用于将一个字符串(源字符串)连接到另一个字符串(目标字符串)的末尾,简单点来说就是将两个毫不相干的字符串连接在一起组成一个新的字符串。

通过查询我们可知:strcat函数的参数,返回值类型和strcpy函数的类型和意义都相同

注意:

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

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

3.目标空间必须可以修改。


3.2strcat函数的使用


int main()
{
  char arr1[100] = "hello ";
  char arr2[10] = "world";
  char* ret = strcat(arr1, arr2);
  printf("%s \n", ret);
  return 0;
}


26ba21dc0b604fecae7c71ef43b5fcdb.png


3.3模拟实现strcat


char* my_strcat(char* str1,const char* str2)
{
  char* p = str1;
  while (*str1 != '\0')
  {
    str1++;
  }
  while (*str1++ = *str2++);
  return p;
}
int main()
{
  char arr1[100] = "hello ";
  char arr2[] = "world";
  char* ret = my_strcat(arr1, arr2);
  printf("%s\n", ret);
  return 0;
}


fc7556269d484476a85863f1a54020fd.png


4.strcmp函数


4b4b9ccaa692480b99df3d5e0fb4e433.png


4.1strcmp函数的介绍


strcmp函数的作用:用于比较两个字符串的大小。

通过查询我们可知:strcmp函数的返回值为intl类型,参数为const修饰不可修改的连个 char * 类型的指针;

注意:

标准规定:

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

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

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

那么如何判断两个字符串呢?

说是比较字符串的大小,其实是比较字符传中每个字符的大小。

从两个字符串中的起始字符开始按照标准规定一个一个比较下去,知道判断出某一个字符的大小,才会返回数字,如果返回0的话意味着两个字符串中的每个字符都相等。


4.2strcmp函数的使用


int main()
{
  char arr1[] = "abc";
  char arr2[] = "adc";
  int ret = strcmp(arr1, arr2);
  printf("%d \n", ret);
  return 0;
}


6192c98a73a845b680cb43e4df049af0.png

在这个例子中arr1字符串中的第二个字符 'b' 小于arr2字符串中的第二个字符 'd',所以返回一个小于0的数字。


4.3模拟实现strcmp函数

int my_strcmp(char* str1, char* str2)
{
  while (*str1 == *str2)
  {
    if (*str1 == '\0')
    {
      return 0;
    }
    str1++;
    str2++;
  }
  return *str1 - *str2;
}
int main()
{
  char arr1[] = "abc";
  char arr2[] = "abc";
  int ret = my_strcmp(arr1,arr2);
  printf("%d\n", ret);
  return 0;
}


b5d347deeb7e479d8b0523c6b2397448.png


5.strstr函数


d5db94389a76452398ddebd6c7cbacce.png


5.1strstr函数的介绍


strstr函数的作用:用于在一个字符串中查找另一个字符串的第一次出现的位置。(判断一个字符串是否为一个字符串的子字符串)。

通过查询我们可知:strstr函数的返回值为char * 类型的指针,参数为两个不可修改的char *类型的指针


5.2strstr函数使用


int main()
{
  char arr1[] = "abbbcde";
  char arr2[] = "bbc";
  char* ret = strstr(arr1, arr2);
  printf("%s \n", ret);
  return 0;
}


528a6b48c7b6426dbbf1b48210ddfd01.png


5.3模拟实现strstr函数

char* my_strstr(char *str1, char* str2)
{
  char* cp = str1;
  char* s1 = str1;
  char* s2 = str2;
  if (*str2 == '\0')
    return str1;
  while (*cp)
  {
    s1 = cp;
    s2 = str2;
    while (*s1 && *s2 && *s1 == *s2)
    {
      s1++;
      s2++;
    }
    if (*s2 == '\0')
      return cp;
    cp++;
  }
  return NULL;
}
int main()
{
  char arr1[] = "abbbcdef";
  char arr2[] = "bbc";
  char* ret = my_strstr(arr1, arr2);
  if (ret != NULL)
    printf("%s\n", ret);
  else
    printf("找不到\n");
  return 0;
}


5fcd82bda9804c51901a10a485aea84b.png

相关文章
|
12小时前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
15 2
|
12小时前
|
编译器
练习使用动态内存相关的4个函数:malloc、calloc、realloc、free
在了解使用动态内存相关的四个函数之前,我们先了解一下,为什么要有动态内存分配?
16 0
|
12小时前
|
存储 编译器 C++
【C++】内存管理和模板基础(new、delete、类及函数模板)
【C++】内存管理和模板基础(new、delete、类及函数模板)
22 1
|
12小时前
|
编译器 C语言 C++
详解内存操作函数
详解内存操作函数
|
12小时前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
12小时前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
12小时前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
12小时前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
12小时前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
|
12小时前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
5 0