长度不受限制的字符串函数【详解+模拟实现】

简介: 长度不受限制的字符串函数【详解+模拟实现】

字符串函数

字符串函数即为在操作字符串中使用的一些函数,例如gets()函数(在标准输入设备中读取字符串函数,以回车结束),或者strlen函数,这些函数都属于字符串函数

且字符串函数其实可以分为两种

1.长度不受限制的字符串函数

2.长度受限制的字符串函数



长度不受限制的字符串函数

长度不受限制的字符串函数,字面意思,即在使用该类函数对字符串进行操作时,不存在长度限制

例如strlen()函数,该函数判断字符串的长度,且该函数在使用中,长度不受限制。

除了strlen函数,本章还会介绍:

strcpy函数 - 字符串拷贝函数

strcat函数 - 字符串追加函数

strcmp函数 - 字符串比较函数



strcpy函数

strcpy函数

字符串拷贝函数,一般可以用于将一个字符串的内容拷贝到另一个字符串中(或字符数组中,包括’\0’)。 且在拷贝过程中,不受字符串的长度限制,该函数将字符串拷贝到另一块字符数组中,直到将字符’\0’拷贝过去为止

strcpy函数的使用
int main()
{
  char arr1[] = "abcde";
  char arr2[20] = "xxxxxxxxxxxx";
  strcpy(arr2, arr1);
//此时arr2[]内的元素即为{'a','b','c','d','e','\0','x','x','x','x','x','x'}
  return 0;
}

由此可知,strcpy函数会将原字符串中的’\0’也一并拷贝到目标字符串中


strcpy函数的模拟实现

从该图可以看出,strcpy函数的返回值为char*,且共有两个参数

  1. char* strDestination - 需要拷贝的目的地地址
    2.const char* strSource - 源字符串首字符地址
    根据该图的参数,是否能模拟出strcpy函数?

可 !!

根据给出的信息,可以了解该函数传递的两个参数即为目的地及原字符串的首字符地址,且该函数在拷贝过程中将源字符串上的’\0’也一并拷贝进了目标地址,故可以使用while循环,遍历并拷贝该字符串中各个字符至目标地址,直到该字符串拷贝完’\0’,即拷贝结束;

理论存在,实践开始:

#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
  //为了提高代码健壮性,且在该程序中指针src中的数据不进行改动
  //故使用const将指针src进行修饰,防止其被更改
  assert(dest && src);
  //确保该函数中传入的两个地址为非指针,对两个指针进行断言
  char* ret = dest;
  //创建一个指针变量存放目标地址的初始位置,方便返回
  while (*dest++ = *src++) {
    ;//对字符边进行遍历边进行拷贝,当拷贝至'\0'时,('\0'的ASCII码值为0),即为假,跳出循环
  }
  return ret;
}
void test1()
{
  char arr1[] = "abcdefg";
  char arr2[20] = { 0 };
  my_strcpy(arr2,arr1);
  printf("%s\n", arr2);
}
int main()
{
  test1();
  return 0;
}

strcpy函数使用注意事项

在strcpy函数使用过程中,应确保几件事:

  • 源字符串必须以’\0’结束。
  • 会将源字符串中的’\0’拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。


strcat函数

strcai函数

字符串追加函数,一般用于在一个字符串中追加另一个字符串的内容

该函数会从目标字符串的’\0’处开始追加源字符串内的内容,直到’\0’结束。


strcat函数的使用

使用例子参考以下代码:

#include<string.h>
#include<stdio.h>
void test1()
{
  char arr1[20] = "hello \0xxxxxxxxxx";
  char arr2[] = "world";
  strcat(arr1, arr2);
  printf("%s\n", arr1);
}
int main()
{
  test1();
  return 0;
}

结果如下

从该结果可知,strcat函数在使用过程中,找到目标空间的’\0’位置并将该位置开始向后的内容修改为源字符串,直到拷贝完’\0’则停止。

strcat函数的模拟实现

从该图可以看出,strcat函数内的参数与strcpy函数中的参数相差无异,

函数的返回类型都为char*

且都存在两个同样的参数 char* strDestination , const char* strSource

在上面的使用过程中,可以看出该函数在追加的过程中,是从目标字符串的’\0’处向后开始追加,直到追加完源字符串内的’\0’即停止

根据这些内容,能否模拟出一个与strcat函数相同的函数。


可!!

从上述内容可知,可以遍历目标字符串的各个字符找到’\0’时停下并从该处开始追加源字符串的内容,直至’\0’结束

理论存在,实践开始。

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char*dest,const char*src)
{ //提高健壮性,且确保指针src内的值不会被通过src进行修改,故对src指针进行const修饰
  //确保传进的两个参数都不为空指针NULL
  assert(dest && src);
  char* ret = dest;//创建一个指针变量用来存放目标地址的初始地址,方便最后返回
  while (*++dest != '\0');//找到目标字符串中的'\0'
  while (*dest++ = *src++);//从目标字符串中的'\0'处开始追加原字符串内容,直到遇到'\0'则停下
  return ret;
}
void test1()
{
  char arr1[20] = "hello \0xxxxxxxxxx";
  char arr2[] = "world";
  my_strcat(arr1, arr2);
  printf("%s\n", arr1);
}
int main()
{
  test1();
  return 0;
}

strcat函数的注意事项

在使用strcat函数中,应注意:

  • 源字符串必须以’\0’结束。
  • 目标空间必须有足够大,且能容纳下源字符串的内容。
  • 目标空间可被修改。


strcmp函数

strcmp函数

字符串比较函数,通常用来比较两个字符串的大小,比较过程中将两个字符串上相同位置的字符,通过ASCII码值进行比较,当比较出结果时则停止比较

存在以下代码:

strcmp(arr1,arr2);

若:

arr1>arr2则返回大于0的值,

arr1<arr2则返回小于0的值,

两者相等则返回0。

strcmp函数的使用

存在下列代码:

void test1() 
{
  char arr1[] = "abcde";
  char arr2[] = "abcd";
  printf("%d\n", strcmp(arr1,arr2));
}
void test2()
{
  char arr1[] = "abcde";
  char arr2[] = "abcdef";
  printf("%d\n", strcmp(arr1, arr2));
}
void test3()
{
  char arr1[] = "abcde";
  char arr2[] = "abcde";
  printf("%d\n", strcmp(arr1, arr2));
}
int main()
{
  test1();
  test2();
  test3();
  return 0;
}

结果如下:

从结果可以看出,在vs编译器下,strcmp函数在使用中的规则为:

两个字符串进行比较(arr1,arr2):

arr1>arr2返回1

arr1<arr2返回-1

arr1==arr2则返回0

strcmp函数的模拟实现

从该图可以看出,strcmp函数的返回类型为int类型

且该函数共有两个参数,参数均为const char*类型

即在使用过程中,两个指针内部的值不会被修改(const修饰)

根据以上内容,且以vs编译器的环境下


模拟实现该函数:

利用while循环遍历两个字符串中的每一个字符,并对两个字符进行比较,若是相等,则继续比较,若是不相等,则退出循环;判断两个字符的ASCII码值的大小,对应的返回1,0,-1(大于0,小于0,等于0的值)。

理论存在,实践开始。

#include<assert.h>
int my_strcmp(const char*base1,const char*base2)
{ //确保提高两个指针的安全性,对两个指针进行const修饰
  //确保两个指针都不为空指针,对两个指针进行断言
  assert(base1&&base2);
  while (*base1++ == *base2++) {
    //遍历两个字符串,当两个字符串内的内容都相等
    //且两个字符串都遍历到了'\0'处,则两个字符串相等
    if(*base1=='\0'&& *base2 == '\0')
    {
      return 0;//当两个字符串相等时返回0
    }
  }
  if (*(base1 - 1) > *(base2 - 1)) { 
    //再进行最后一次循环时,两个指针都已经向后越了一步
    //故判断两个指针最后一步之前的那一步时哪个字符比较大
    //若是*base1>*base2则返回1
    return 1;
  }
  //否则返回-1
  else return -1;
}
void test1()
{
  char arr1[] = "abcde";
  char arr2[] = "abcd";
  printf("%d\n", my_strcmp(arr1, arr2));
}
void test2()
{
  char arr1[] = "abcde";
  char arr2[] = "abcdef";
  printf("%d\n", my_strcmp(arr1, arr2));
}
void test3()
{
  char arr1[] = "abcde";
  char arr2[] = "abcde";
  printf("%d\n", my_strcmp(arr1, arr2));
}
int main()
{
  test1();
  test2();
  test3();
  return 0;
}

strcmp函数的注意事项

strcmp函数在使用中应明白

  • 第一个字符串大于第二个字符串时,返回大于0的数;
  • 第一个字符串等于第二个字符串时,返回0;
  • 第一个字符串小于第二个字符串时,返回小于0的数;
  • 比较的为两个字符串对应字符的ASCII码值,当比较处结果时则停止比较。
  • 并非谁长谁就大。


相关文章
|
C语言 C++
C/C++字符函数和字符串函数模拟实现与详解————长度不受限制的字符串函数
C/C++字符函数和字符串函数模拟实现与详解————长度不受限制的字符串函数
61 0
|
8月前
|
机器学习/深度学习 编译器 C语言
【C语言】数据输出的域宽控制(如何在输出数据时控制0占位)(如何输出前导0)(保留几位小数)(乘法口诀表打印不齐)等问题
【C语言】数据输出的域宽控制(如何在输出数据时控制0占位)(如何输出前导0)(保留几位小数)(乘法口诀表打印不齐)等问题
117 0
|
8月前
|
PHP
在数组中,找出给定数字的出现次数,比如[1,2,3,2,2]中2的出现次数是3次(任意编程语言描述)
在数组中,找出给定数字的出现次数,比如[1,2,3,2,2]中2的出现次数是3次(任意编程语言描述)
48 0
|
3月前
|
自然语言处理 C语言 开发者
字符串函数详解(看这一篇就足够了)(上)
字符串函数详解(看这一篇就足够了)(上)
62 2
|
3月前
|
C语言
字符串函数详解(看这一篇就足够了)(下)
字符串函数详解(看这一篇就足够了)(下)
67 2
|
7月前
|
C语言
C语言-----多组输入,一个整数(1~100),表示线段长度,即“*”的数量
C语言-----多组输入,一个整数(1~100),表示线段长度,即“*”的数量
求字符串函数和长度不受限制的字符串函数的详解
求字符串函数和长度不受限制的字符串函数的详解
|
8月前
|
C++
41.用c++编写程序:从键盘上任意输20个1-99之间的整数,分别统计其个位数0-9的数字各有多少
41.用c++编写程序:从键盘上任意输20个1-99之间的整数,分别统计其个位数0-9的数字各有多少
67 0
|
运维 Shell Python
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(一)
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)
140 0
|
8月前
|
存储 C# 索引
C# 字符串操作指南:长度、连接、插值、特殊字符和实用方法
字符串用于存储文本。一个字符串变量包含由双引号括起的字符集合
134 2