C语言中一些库函数(字符串类型)的实现

简介: C语言中一些库函数(字符串类型)的实现

一. strcmp


初学这个函数的时候可能有误区,以为比较的是字符串长度,实则不然,strcmp比较的是字符的ascii码值,在vs编译器中,第一个字符大于第二个字符,就>0;小于第二个字符,就<0;

第一个字符等于第二个字符,就=0,相等就比较下一个字符,依此递推。

int strcmp( const char *string1, const char *string2 );

1.参数说明


string1和string2为两个要比较的字符串,返回一个int值。


2.代码实现

int my_strcmp(const char* str1, const char* str2)
{
    assert(str1&&str2);//断言,NULL指针直接失败
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
        {
            return 0;
        }
        str1++;
        str2++;
    }
    /*if (*str1 > *str2)
        return 1;
    else
        return -1;*/
       //简化
    return (*str1 - *str2);
}
int main()
{
  const char* str1 = "abcdef";
  const char* str2 = "aqwer";
  //利用库函数int ret = strcmp(str1, str2);//实际比的不是长度,而是比的字符ascii码值
    int ret=my_strcmp(str1,str2);
  //a=s,那么往后比较
  printf("%d\n", ret);//linux -gcc操作系统中当是>0 返回>0;当时=0,返回0;当是<0,返回<0
  //判断要>,=,<0
  return 0;
}


二.strncmp


1.指定前n个字符进行比较,不受'\0'的限制,需要输入三个参数,

int strncmp( const char *string1, const char *string2, size_t count );

string1和string2两个要比较的字符串和要比较count个字符。

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strncmp(char* str1, char* str2, size_t count)
{
  assert(str1 && str2);//断言
  while (*str1 == *str2 && count)//简化语句
  {
  if (*str1 == '\0')
  {
    return 0;
  }
  str1++;
  str2++;
  count--;
  }
  if (count == 0)//此处说明已经前几个相同了。
  {
  return 0;
  }
  if (*str1 > *str2)
  return 1;
  else if (*str1 < *str2)
  return -1;
  else
  return 0;
}
int main()
{
  char str1[] = "abddd";
  char str2[] = "abd";
  int ret =my_strncmp(str1, str2, 4);
  printf("%d\n", ret);
  return 0;
}


三.strcpy


1.字符串拷贝

char *strcpy( char *strDestination, const char *strSource );

把一个字符串拷贝到另一个字符串,结束以'\0'为标识。需要注意的是目的地空间应该大于起始。


2.代码实现

char* my_strcpy(char* dest, const char* sry)
{
  assert(dest && sry);
  char* start = dest;//返回起始位置
  while (*sry != '\0')
  {
  *dest = *sry;
  dest++;
  sry++;
  }
  if (*sry == '\0')
  *dest = '\0';
  return start;
}
int main()
{
  char arr1[] = "bit";
  char arr2[] = "hello world";
  my_strcpy(arr2, arr1);
  printf("%s\n", arr2);
  return 0;
}


四.strncpy


1.拷贝num个字符从源字符串到目标空间,不过在笔者看来,这个库函数并不能让人满意,主要是因为看图::


1669211091182.jpg


相信大家可以看到,我只想拷贝bitb到arr2,而这是因为库函数没有进行追加'\0'.笔者自我实现一个函数,(说不定是笔者浅薄,无法理解库函数深意),实现只要num个字符拷贝。


2.代码实现

#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* sry, int count)
{
  assert(dest && sry);
  char* start = dest;
  while (count&&(*dest++=*sry++))//凝炼成这么一个短句真是精妙
  {
  count--;
  }
  if (count!='\0')
  {
  while (--count)//因为是先执行上个while条件句再判断,故count在上个while语句未减1,而执行了*dest++=*sry++,所以应该前置--
  {
    *dest++ = '\0';
  }
  }
                else
                      *dest='\0';//加上这么一句话就可以弥补库函数的瑕疵
  return start;
}
int main()
{
  char arr1[] = "bit";
  char arr2[] = "abcedfg";
  my_strncpy(arr2, arr1, 5);//需要注意目的地数组的空间应该大于等于要拷贝的长度
  printf("%s\n", arr2);
  return 0;
}


五.strncat--字符串追加


1.在dest末尾追加num个字符,注意目的地空间要够大,追加最后在后面补个'\0'.

char *strncat( char *strDest, const char *strSource, size_t count );

2.代码实现

#include<stdio.h>
#include<assert.h>
char* my_strncat(char* dest, const char* sry, int count)
{
  assert(dest && sry);
  char* start = dest;
  while (*dest != '\0')
  {
  dest++;
  }//直接到代码末尾
  while (count&&(*dest++=*sry++))
  {
  count--;
  }
  if (count)//说明sry已经到'\0'
  {
  while (--count != 0)\\这个前置--挺好玩
  {
    *dest++ = '\0';
  }
  }
  else
  *++dest = '\0';
  return start;
}
int main()
{
  char arr1[30] = "hello";
  char arr2[] = "world";//时候会在后面补个'\0',如果追加的个数长于源字符串,那么就打印源字符串
  my_strncat(arr1, arr2, 2);//追加的
  printf("%s\n", arr1);
  return 0;
}


六.strstr--字符串查找


1.函数


1、strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。

2、找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;

3、如果未找到所搜索的字符串,则返回NULL。

char *strstr(const char *dest, const char *sry);

dest: 被查找目标

sry: 要查找对象.


2.函数实现

char* my_strstr(const char* dest, const char* sry)
{
  assert(dest && sry);
  const char* dest1 = dest;
  const char* sry1= sry;
  const char* tmp = dest;//设两个dest的替换,一个用于判断,一个用于跳出循环
  while (*tmp)
  {
  dest1 = tmp;
  sry1 = sry;//如果不等,那么再次循环时dest1要往后查找,所以要赋tmp,而sry1则还是在首地址
  while (*dest1 && *sry1 && (*dest1 == *sry1))
  {
    *dest1++;
    *sry1++;
  }
  if (*sry1 == '\0')
  {
    return (char*)tmp;//找到子串并返回要第一次匹配字符串的地址
  }
  if (*dest1 == '\0')//一直到查完dest都没找到
  {
    return NULL;
  }
  tmp++;
  }
}
int main()
{
  const char*str1="bbc";
    const char*str2="bcbbcdef";
  char* ret =my_strstr(str2,str1);
  if (ret == NULL)
  {
  printf("子串不存在\n");
  }
  else
  printf("找到子串:%s\n", ret);
  return 0;
}

以上是笔者初学C的一些字符串库函数实现的代码。有几个是笔者自己敲构造的,在编译过程中没有出现问题。如果有问题,劳烦各位大佬指教啊。🌹

相关文章
|
2月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
233 15
|
7月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
171 1
一文彻底搞清楚C语言的函数
|
8月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
358 16
|
8月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
196 3
|
8月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
167 2
|
存储 编译器 C语言
在C语言中的数组和字符串
在C语言中的数组和字符串
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
344 8
|
存储 机器学习/深度学习 Linux
【C语言】语言篇——数组和字符串
【C语言】语言篇——数组和字符串
77 0
|
存储 C语言
C语言之指针(指针数组以及指针的指针和字符串)
C语言之指针(指针数组以及指针的指针和字符串)
181 0
|
安全 C语言
C语言8 数组与字符串
C语言8 数组与字符串
93 0