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

相关文章
|
8天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
48 24
|
4天前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
42 16
|
3天前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
15 3
|
3天前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
10 2
|
7天前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
37 1
|
C语言 图形学 数据格式
C语言库函数大全及应用实例一
原文:C语言库函数大全及应用实例一                                 [编程资料]C语言库函数大全及应用实例一 函数名: abort 功 能: 异常终止一个进程 用 法: void abort(void); 程序例: #i nclude #i nclude .
924 0
|
C语言 图形学 数据格式
C语言库函数大全及应用实例一
[编程资料]C语言库函数大全及应用实例一 函数名: abort 功 能: 异常终止一个进程 用 法: void abort(void); 程序例: #i nclude #i nclude int main(void...
786 0
|
移动开发 图形学 C语言
C语言库函数大全及应用实例二
[编程资料]C语言库函数大全及应用实例二 函数名: bioskey 功 能: 直接使用BIOS服务的键盘接口 用 法: int bioskey(int cmd); 程序例: #i nclude #i...
657 0
|
C语言 图形学 数据格式
C语言库函数大全及应用实例三
[编程资料]C语言库函数大全及应用实例三 函数名: ecvt 功 能: 把一个浮点数转换为字符串 用 法: char ecvt(double value, int ndigit, int *decpt, int *sign); 程序例: #i nclude #i nclude #i nc...
670 0
|
图形学 C语言
C语言库函数大全及应用实例四
[编程资料]C语言库函数大全及应用实例四 couble fmod (double x, double y); 返回x对y的模,即x/y的余数。
979 0

热门文章

最新文章