字符串函数的介绍及模拟实现

简介: 字符串函数的介绍及模拟实现

长度受限制的字符串函数


 这篇文章将会向大家介绍几个长度受限制的字符串函数,分别是strncpy、strncat和strncmp。为什么这三个函数是长度受限制的字符串函数呢?因为在调用这些函数时,我们需要多传一个无符号整型数据。相较于长度不受限制的字符串函数,长度受限制的字符串函数也更加安全。首先我们先来学习strncpy。


1.strncpy


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


9d5e074832fa4a49a0ba6f4b929673f8.png

 对于strncpy函数,我们需要注意一下几点:


  • 拷贝num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
  • 目标空间必须可变。
  • 模拟实现strncpy函数


代码示例:  

1c9bcf8ab2e4404d87680bbea4adca64.png


字符串的长度小于 num 的情况


#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
  char arr1[10] = "hello####";
  char arr2[] = "bite";
  strncpy(arr1, arr2, 6);
  printf("%s\n", arr1);
  return 0;
}

a77337fcc2f743f7a081a1051f5b3b32.jpg

9843ff72da124fa48fa47f7c4e6204c2.jpg

模拟实现strncpy函数 :


#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strncpy(char* dest, char* source, int n)
{
  assert(dest && source);
  char* start = dest;
  while (n && ((*dest++ = *source++) != '\0'))
  {
    n--;
  }
  //注意source先给dest赋值,再判断dest是否为\0
  //所以当source为\0时,也会给dest赋值,不满足条件推出循环
  if (n)
  {
    while (--n)
    {
      *dest++ = '\0';   
    }
  }
  return start;
}
int main()
{
  char arr1[30] = "remember who you are!";
  char arr2[] = "believe yourself!";
  my_strncpy(arr1, arr2, 30);
  printf("%s\n", arr1);
  return 0;
}


2.strncat


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


6455a4d919364e80a2887673696e8f74.png

 对于strncat函数,我们需要注意一下几点:


  • 将源字符串的字符追加到目标空间,以及 '\0' 。
  • 如果源字符串的长度小于num,则仅复制 '\0' 之前的内容以及 '\0'。
  • 目标空间必须可变。
  • 模拟实现strncat函数。


代码示例 :

265ec248511c4805a8cd648e3aee1873.png


模拟实现strncat函数


#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strncat(char* dest, char* source, int n)
{
  assert(dest && source);
  char* start = dest;
  while (*dest != '\0')
  {
    dest++;
  }
  while (n--)
  {
    if ((*dest++ = *source++) == '\0')
    {
      return start;
    }
  }
  *dest = '\0';
  return start;
}
int main()
{
  char arr[20] = "hello \0#########";
  char arr2[] = "ww";
  my_strncat(arr, arr2, 4);
  printf("%s\n", arr);
  return 0;
}


 注意:strncat 函数和 my_strncat 函数只会给目标空间的末尾加一个 '\0'。


3.strncmp


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


7d5bdba8c50d4fda9af54f6e3eeb38ab.png

 对于strncmp函数,我们需要注意: 此函数开始比较每个字符串的第一个字符。如果它们相等,则继续向后比较,直到字符不同或直到'\0'亦或比较次数达到num。strncmp的返回值为大于0、等于0或小于0。


代码示例

18eeb8f1a8df476b8a1f4a896e05c01a.png


模拟实现strncmp函数


#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strncmp(const char* str1, const char* str2, int n)
{
  assert(str1 && str2);
  int count = 0;
  while (*str1 == *str2)
  {
    count++;
    if (*str1 == '\0')
      return 0;
    if (count == n)
      return 0;
    str1++;
    str2++;
  }
  return *str1 - *str2;
}
int main()
{
  char arr1[] = "hello ";
  char arr2[] = "hello sz";
  int ret;
  ret = my_strncmp(arr1, arr2, 6);
  printf("ret = %d\n", ret);
  ret = my_strncmp(arr1, arr2, 7);
  printf("ret = %d\n", ret);
  return 0;
}


 以上就是本篇博客的内容,大家可以尝试去模拟实现这些函数,让自己理解得更加深刻。如果大家觉得有收获的话,可以点个赞支持一下哦!!

相关文章
|
6月前
(二)字符函数和字符串函数详细讲解和模拟实现(优化)
(二)字符函数和字符串函数详细讲解和模拟实现(优化)
|
6月前
(一)字符函数和字符串函数详细讲解和模拟实现(优化)
(一)字符函数和字符串函数详细讲解和模拟实现(优化)
|
6月前
|
安全
16.字符串函数的使用和模拟实现(全)
16.字符串函数的使用和模拟实现(全)
|
7月前
字符串函数的模拟实现
字符串函数的模拟实现
41 1
|
7月前
|
C语言
字符函数和字符串函数解析及模拟实现
字符函数和字符串函数解析及模拟实现
77 0
|
C语言 C++
C/C++字符函数和字符串函数详解————内存函数详解与模拟
C/C++字符函数和字符串函数详解————内存函数详解与模拟
51 1
|
程序员
字符串函数的使用及其模拟实现
字符串函数的使用及其模拟实现
51 0
|
编译器 C语言
字符串函数的使用及模拟实现
字符串函数的使用及模拟实现
38 0
|
C语言
深入探索字符串函数与模拟实现
深入探索字符串函数与模拟实现
99 1
深入探索字符串函数与模拟实现