【C语言】模拟实现字符串函数(下)

简介: 【C语言】模拟实现字符串函数(下)

1.模拟实现strncpy

1.1函数介绍

strncpy:指定长度拷贝字符串函数,将一个字符串中指定的个数字符拷贝到另一个字符串中


1.2函数模拟实现

q4.png


通过查询 strncpy 函数,我们可以发现 strncpy 函数有三个参数,前两个参数分别都是指针类型,(第一个指针指向的是目标空间,第二个指针指向的是源字符串),第三个参数是 size_t 类型(无符号整型)用来存储需要拷贝几个字符的个数。我们要把源字符串中指定个数的字符拷贝到目标空间中,所以目标空间要足够大,能存储的下源字符串中的指定个数的字符,并且可修改 。如果源字符串的长度小于 num,则拷贝完源字符串之后,在目标的后边追加 0,直到 num 个。


#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* str1, const char* str2, int count)
{
    assert(str1 && str2);
    char* ret = str1;
  while (count && (*str1++ = *str2++) != '\0')
  {
  count--;
  }
  if (count)
  {
  while (--count)
  {
    *str1++ = '\0';
  }
  }
    return ret;
}
int main()
{
  char arr[10] = { "abcdef" };
  char brr[10] = { "zhang" };
  my_strncpy(arr, brr, 2);
  printf("%s\n", arr);
  return 0;
}

分析:返回类型是 char*,我们用一个字符指针变量指向目标首地址,为了避免 str1 在后面指向的时候会改变指向的位置。进入 my_strncpy 函数,首先判断 (count && (*str1++ = *str2++) != '\0')然后 count-- ,直到条件不满足跳出。然后判断 count 是否为 0,若 count 为 0,则表示上面的循环结束是因为 count 为 0 而结束, 那么说明 count 小于等于 *str2 里面的字符个数,那么 count 个字符已拷贝完了,但还没有到目标空间的结尾所以不需要加 ‘\0’。如果count 不为 0,则是因为 (*str1++ = *str2++)==‘\0’,为退出循环的,那么说明 *str2 里面的字符个数小于 count 则在后面加上 ‘\0’。


2. 模拟实现strncat

2.1函数介绍

strncat: 指定长度追加字符串函数,将一个字符串中的 n 个字符追加到另一个字符串的后面


2.2函数模拟实现


q3.png

通过查询 strncat 函数,我们可以发现 strncat 函数有三个参数,前两个参数分别都是指针类型,(第一个指针指向的是目标空间,第二个指针指向的是源字符串),第三个参数是 size_t 类型(无符号整型)用来存储需要追加几个字符的个数。我们要把源字符串追加到目标空间中,所以目标空间要足够大,能存储的下追加的指定个数源字符串中的字符,并且可修改。


#include<stdio.h>
#include<assert.h>
char* my_strncat(char* str1, char* str2, int count)
{
    assert(str1 && str2);
  char* start = str1;
  while (*str1 != '\0')
  {
  str1++;
  }
  while (count--)
  {
  if ((*str1++ = *str2++) == '\0')
  {
    return start;
  }
  }
  *str1 = '\0';
  return start;
}
int main()
{
  char arr1[20] = "hello ";
  char arr2[] = "world";
  char* ret = my_strncat(arr1, arr2, 5);
  printf("%s\n", ret);
  return 0;
}


分析:返回类型是 char*,我们用一个字符指针变量指向目标首地址,为了避免 str1 在后面指向的时候会改变指向的位置。找到目标空间 '\0' 的位置,然后将源字符串中的 count 个字符依次追加到目标空间里面,如果((*str1++ = *str2++) == '\0'),说明源字符串中的字符小于等于 count ,直接返回 start ,若count == 0,而结束的循环,则在拷贝完后 *str1 还需要赋值为 '\0'。


3.模拟实现strncmp

2.1函数介绍

strncmp: 指定长度比较字符串函数,是用来比较两个字符串中指定个数字符大小的函数


2.2函数模拟实现

q2.png


通过查询 strncmp 函数,我们可以发现 strncmp 函数有三个参数函数,前两个参数是两个指针(分别指向着两个需要比较的字符串),第三个参数是需要比较的字符个数。因为只需要比较不需要改变,所以前面加上了 const 。返回值为 int ,第一个字符串大于第二个字符串,则返回大于 0 的数字;第一个字符串等于第二个字符串,则返回0;第一个字符串小于第二个字符串,则返回小于0的数字。


q1.png


#include<stdio.h>
#include<assert.h>
int my_strncmp(const char* str1,const char* str2, int count)
{
  assert(str1 && str2);
  while (count-- && *str1 == *str2)
  {
  if (count == 0)
  {
    return 0;
  }
  str1++;
  str2++;
  }
  if (*str1 > *str2)
  {
  return 1;
  }
  else
  {
  return -1;
  }
}
int main()
{
  char* arr1 = "abcz";
  char* arr2 = "abcc";
  int ret = my_strncmp(arr1, arr2, 4);
  printf("%d\n", ret);
  return 0;
}


分析:count-- && *str1 == *str2,如果 count 不为 0 ,且 *str == *str2 ,就进入循环判断 count-- 后是否为 0,若为 0 则代表两个字符串比较 count 个字符已结束,但并没有跳出循环说明两个字符串相等。若当 *str1 == *str2 不成立,说明已找出两个字符串中不同的字符了,就直接跳出循环去比较这两个字符的大小。


相关文章
|
3月前
|
C语言 C++
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
|
3月前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
43 0
|
3月前
|
存储 安全 编译器
深入C语言库:字符与字符串函数模拟实现
深入C语言库:字符与字符串函数模拟实现
|
3月前
|
C语言
C语言常见字符函数和字符串函数精讲
C语言常见字符函数和字符串函数精讲
|
3月前
|
C语言
【C语言】模拟实现深入了解:字符串函数
【C语言】模拟实现深入了解:字符串函数
|
5月前
|
安全 程序员 C语言
【C语言】字符串函数及其模拟实现
【C语言】字符串函数及其模拟实现
|
5月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
69 0
|
5月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
62 0
|
6月前
|
存储 缓存 C语言
【C语言】字符函数,字符串函数,内存函数
C语言中的字符串函数和内存函数
84 0
【C语言】字符函数,字符串函数,内存函数
|
7月前
|
C语言
【c语言】字符串函数的模拟实现(二)
【c语言】字符串函数的模拟实现(二)
31 1