一篇文章让你看懂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

相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
19天前
|
C语言
【c语言】动态内存管理
本文介绍了C语言中的动态内存管理,包括其必要性及相关的四个函数:`malloc`、``calloc``、`realloc`和`free`。`malloc`用于申请内存,`calloc`申请并初始化内存,`realloc`调整内存大小,`free`释放内存。文章还列举了常见的动态内存管理错误,如空指针解引用、越界访问、错误释放等,并提供了示例代码帮助理解。
29 3
|
24天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
53 7
|
26天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
21天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
18 0
|
30天前
|
C语言
保姆级教学 - C语言 之 动态内存管理
保姆级教学 - C语言 之 动态内存管理
18 0
|
5天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
21 6
|
25天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10