字符串函数和内存函数的介绍(一)

简介: 今天小编给大家带来的是常用的字符串函数和内存函数的介绍以及它们中的部分函数的模拟实现,希望大家跟着小编的步伐,对这些函数的用法和逻辑有个大概的理解。

前言

 今天小编给大家带来的是常用的字符串函数和内存函数的介绍以及它们中的部分函数的模拟实现,希望大家跟着小编的步伐,对这些函数的用法和逻辑有个大概的理解。


1.strlen函数

strlen函数的作用是得到字符串的长度.


size_t strlen ( const char *str );这里给出strlen函数的返回值和形式参数。以下有几点是大家需要注意的


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


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


3.函数的返回值为size_t,是无符号的(因为长度是不会出现负数的,所以我们这里使用无符号数)


使用演示:

#include<stdio.h>
#include<string>//使用strlen函数前要包含该头文件
int main()
{
 char arr[]="abcdefg";
 int ret=strlen(arr);
 printf("%d",ret);
 return 0;
}

代码结果:7


函数模拟实现:


对于strlen函数这里有三种模拟方法这里给大家介绍两种(还有一种我们放在指针的介绍中给大家说明)


#include<stdio.h>
#include<assert.h>
//strlen函数的模拟实现
//法一:
size_t my_strlen1(const char* str)
{
  assert(str != NULL);
  size_t count = 0;
  while (*str != '\0')
  { 
  count++;
  str++;
    }
  return count;
}
//法二:递归
size_t my_strlen2(const char* str)
{
  assert(str != NULL);
  if (*str != '\0')
  {
  return 1 + my_strlen2(str + 1);
  }
  else
  return 0;
}
int main()
{
  char arr[] = "abcdefghi";
  int ret = my_strlen1(arr);
  int ret1= my_strlen2(arr);
  printf("%d %d ", ret,ret1);
  return 0;
}


结果如下:


image.png


2.strcpy

 strcpy函数的作用是将源字符串复制到目标字符串的作用,下面给出该返回值和形式参数


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


 这里source表示的是源字符串,destination表示的是目标字符串,该返回值返回的是目标字符串的地址来让我们使用。以下这里还有几点我需要说明


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


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


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


4.目标空间必须可变。(常量字符串不可修改)


对于第四点相信大家可能不是很理解,这里我用代码给大家解释一下


image.png


这里代码发生了错误,该原因就是由于常量字符串是不可修改的,所以该不能作为目标空间。


但是如果该字符作为源字符串,这里就是可以使用的,演示如下


#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>//使用strcpy函数前要包含该头文件
int main()
{
  char arr[20] = { 0 };
  char* p = "abcdefg";
  printf("%s ",strcpy(arr, p));
  return 0;
}

结果:

image.png



函数模拟实现:


#include<stdio.h>
#include<assert.h>
//strcpy函数的模拟实现
char* my_strcpy(char* dest, const char* src)
{
  assert(dest && src);
  char* ret = dest;
  while (*dest++ = *src++)//这里的是先进行解引用然后再进行指针后移,当*dest==*src=='\0'后结束
  {
  ;
  }
  return ret;
}
int main()
{
  char arr1[20] = "xxxxxxxxxxxx";
  char arr2[] = "hello world";
  printf("%s ", my_strcpy(arr1, arr2));
  return 0;
}


代码结果如下:

image.png



3.strcat

 strcat函数的作用是实现字符串的追加,该返回值和形式参数如下


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


该是将source表示的源字符串追加到destination的目标字符串中,返回的是目标字符串的地址


注意:


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


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


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


4.目标空间必须有\0


使用如下:

#include<stdio.h>
#include<string.h>//使用strcat函数前要包含该头文件
int main()
{
  char arr[20] = "abc";
  char arr1[20]= "abcdefg";
  printf("%s ",strcat(arr, arr1));
  return 0;
}

结果展示:


image.png


模拟函数:

#include<stdio.h>
#include<assert.h>
//strcat函数的模拟实现
char* my_strcat(char* dest, char* src)
{
  assert(dest && src);
  char* ret = dest;
  while (*dest != '\0')
  {
  dest++;
  }
  while (*dest++ = *src++)
  {
  ;
  }
  return ret;
} 
int main()
{
  char arr1[20] = "hello";
  char arr2[] = " world";
  printf("%s", my_strcat(arr1, arr2));
  return 0;
}


结果如下:


4.strcmp

strcmp函数的作用是进行字符串的比较,该返回值和形参如下


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

标准规定:

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


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


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


另外对于strcmp函数的使用字符串的比较方式是比较对应位置的ASCLL码值。


使用方式如下


#include<stdio.h>
#include<string.h>//使用strcmp函数前要包含该头文件
int main()
{
  char arr[20] = "abc";
  char arr1[20]= "abcdefg";
  printf("%d",strcmp(arr, arr1));
  return 0;
}

结果如下:


image.png


模拟实现:


#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
  assert(str1 && str2);
  while (*str1 == str2)
  {
  if (*str1 == 0)
  {
    return 0;
  }
  str1++;
  str2++;
  }
  if (*str1 > *str2)
  {
  return 1;
  }
  else
  return -1;
}
int main()
{
  char arr1[] = "abbc";
  char arr2[] = "accs";
  int ret = my_strcmp(arr1, arr2);
  printf("%d", ret);
  return 0;
}

结果如下:


image.png



以上strcpy,strcat,strcmp这三种是长度不受限度的字符串函数,即一直会\0停止,这就导致这三种字符串函数不安全(有着非法访问的风险),这就导致C语言引入了长度受限制的字符串函数strncpy,strncat,strncmp。(由于该三个函数的用法和模拟思路和以上大同小异,这里我们就不进行使用和模拟,大家可以自己进行尝试)


5.strncpy

strncpy函数和strcpy函数的区别是strncpy可以指定源字符串复制到目标字符串的元素个数,


该返回值和形参如下:


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


num表示的是从source中指定拷贝几个元素


如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加\0,直到num个该函数在拷贝过程中,如果source中拷贝的个数少于source的大小,当数据拷贝到destination中后,后面不会自动添加/0


6.,strncat

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


num表示的是从source中指定追加几个字符,在追加后该会自动给字符串destination添加\0


7.strncmp

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


num表示的是指定比较几个字符,该返回值的规定和strcmp的规定一致


相关文章
|
12月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
100 3
|
3月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
243 15
|
10月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
337 6
|
12月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
12月前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
177 0
|
12月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
142 0
|
12月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
246 0
|
12月前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
207 0
|
3月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
808 0

热门文章

最新文章