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的一些字符串库函数实现的代码。有几个是笔者自己敲构造的,在编译过程中没有出现问题。如果有问题,劳烦各位大佬指教啊。🌹

相关文章
|
3天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
26 15
|
3天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
39 24
|
3天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
39 23
|
2天前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
17 1
|
1月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
59 9
|
8月前
|
存储 C语言
C 语言函数完全指南:创建、调用、参数传递、返回值解析
函数是一段代码块,只有在被调用时才会运行。 您可以将数据(称为参数)传递给函数。 函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。
235 3
|
3月前
|
C语言
C语言函数返回值详解
本文详细解析了C语言中函数返回值的概念与应用。从函数的基本定义入手,深入探讨了不同类型返回值的作用及意义,并提供了实用的编程示例,帮助读者更好地理解和使用函数返回值。通过本文,你将掌握如何有效利用返回值优化代码结构与功能实现。
|
7月前
|
存储 C语言
C语言的函数返回值和指针
C|函数返回值(区分各类值)和指针(区分各类存储空间)的细节
|
C语言
C语言---函数---知识点总结(三)------函数的返回值类型
C语言---函数---知识点总结(三)------函数的返回值类型
|
8月前
|
存储 C语言
C语言中向函数传递值和从函数返回值的技术解析
C语言中向函数传递值和从函数返回值的技术解析
87 0