C语言常用字符串库函数实现

早闻写技术博客的N种功效,将理解的东西写出来,既满足了自己的自豪感,还能让藏在民间的高手指出不足或错误之处,实及一大好事。虽为一学生,无工作、缺女友,但还是诸事烦身,博客也已许久没有加入新的文章了。今已是奔“四”之人,快来面临找工作之困,也早闻大的IT公司都重视基础(C/C++、数据结构、算法、计算机网络、数据库),还会有面试时写个算法什么的,特别是一个简单的C库函数......现在自己实现了一些C字符串库函数,现将其放到博客上,以纪念那些打代码的时光。

首先是头文件(cbaselib.h)为有别区于库函数,所有函数名都以“_”开始

#pragma once
#ifndef __CBASELIB
#define __CBASELIB
#include<stdlib.h>
#include<string.h>

char* _reverse(char *str);
int _strlen(const char *str);
//将一个字符串转换成整型
int _atoi(const char *str);
//将一个整型转换成字符串
char* _itoa(int num, char *str);
char* _itoa(int num);
//将一个字符串转换成浮点数
double atof(const char *str);
//将src中的内容复制到dest中
char* _strcpy(char *dest, const char *src);
//将src中的内容连接到dest后面
char* _strcat(char *dest, const char *src);
int _strcmp(const char *str1, const char *str2);
//在str中查找sub
char* _strstr(const char *str, const char *sub);
#endif

下面是实现(cbaselib.c)

#include "cbaselib.h"
#define MAXLEN 100
int _strlen(const char *str)
{
	int len = 0;
	while (*str++ != '\0')
	{
		len++;
	}
	return len;
}

char* _reverse(char *str)
{
	char temp;
	int len = _strlen(str);
	char *rear = str+len-1;
	char *front = str;
	while (front<rear)
	{
		temp = *front;
		*front = *rear;
		*rear = temp;
		front++;
		rear--;
	}
	return str;
}

//将一个字符串转换成整型,只有正常数字串才会转换成功
int _atoi(const char *str)
{
	int res = 0,temp,len=_strlen(str);
	for (int i=0;i<len;i++)
	{
		temp = str[i] - '0';
		res = res * 10 + temp;
	}
	return res;
}

//将一个整型转换成字符串
char* _itoa(int num)
{
	char *str=(char *)malloc(MAXLEN*sizeof(char));
	memset((void *)str, '\0', MAXLEN*sizeof(char));
	//static char str[MAXLEN] = {'\0'};
	int temp,i=0;
	int ne = 0;
	if (num < 0)
	{
		ne = 1;
		num = abs(num);
	}
	while (num)
	{
		temp = num % 10;
		str[i++] = temp + '0';
		num = num / 10;
	}
	if (ne)
	{
		str[i] = '-';
	}
	_reverse(str);
	return str;
}

//将一个整型转换成字符串
char* _itoa(int num,char *str)
{
	//char *str = (char *)malloc(MAXLEN*sizeof(char));
	//memset((void *)str, '\0', MAXLEN*sizeof(char));
	//static char str[MAXLEN] = {'\0'};
	int temp, i = 0;
	int ne = 0;
	if (num < 0)
	{
		ne = 1;
		num = abs(num);
	}
	while (num)
	{
		temp = num % 10;
		str[i++] = temp + '0';
		num = num / 10;
	}
	if (ne)
	{
		str[i] = '-';
		str[i + 1] = '\0';
	}
	else
	{
		str[i] = '\0';
	}
	_reverse(str);
	return str;
}

//将一个字符串转换成浮点数
double _atof(const char *str)
{
	//step 1.将字符串分成整数和小数部分
	//step 2.将两部分复制到新的字符串中-strncpy
	//step 3.将两部分分别转换成整数,记录小数的位数bl
	//res=整数部分+小数部分/power(10,bl);没有实现---眼高手低的毛病又犯了!!!
	return 0;
}

//将src中的内容复制到dest中
char* _strcpy(char *dest, const char *src)
{
	char *res = dest,*temp=res;
	while (*src!='\0')
	{
		*temp++ = *src++;
	}
	return res;
}

//将src中的内容连接到dest后面
char* _strcat(char *dest, const char *src)
{
	int len = _strlen(dest);
	char *res = dest;
	while (*src != '\0')
	{
		res[len++] = *src++;
	}
	return dest;
}

int _strcmp(const char *str1, const char *str2)
{
	int res=0;
	for (int l=0;str1[l]!='\0'&&str2[l]!='\0';l++)
	{
		if (str1[l] == str2[l])
		{
			if (str1[l + 1] == '\0'&&str2[l + 1] != '\0')//字符串2更长
			{
				res = -1;
				break;
			}
			else if (str2[l + 1] == '\0'&&str1[l + 1] != '\0')//字符串1更长
			{
				res = 1;
				break;
			}
			else
			{
				continue;
			}
		}
		else if (str1[l] > str2[l])
		{
			res = 1;
			break;
		}
		else
		{
			res = -1;
			break;
		}
	}
	return res;
}

//在str中查找sub
char* _strstr(const char *str, const char *sub)
{
	int len_f = _strlen(str), len_d = _strlen(sub);
	char *res=NULL;
	size_t i=0,j = 0;
	for (; i < len_f; i++)
	{
		for (j = 0; j < len_d; j++)
		{
			if (str[i+j] == sub[j])
			{
				continue;
			}
			else
			{
				break;
			}
		}
		if (j == len_d)
		{
			res = (char *)&str[i];
			break;
		}
	}
	return res;
}


这里特别注意的一个是_itoa函数,这个函数会在内部动态申请一个内存块,用于存放转换后的字符串。使用完成后一定要记得手动释放它。否则使用下面的_itoa函数会加安全。

//将一个整型转换成字符串
char* _itoa(int num,char *str)
{
	int temp, i = 0;
	int ne = 0;
	if (num < 0)
	{
		ne = 1;
		num = abs(num);
	}
	while (num)
	{
		temp = num % 10;
		str[i++] = temp + '0';
		num = num / 10;
	}
	if (ne)
	{
		str[i] = '-';
		str[i + 1] = '\0';
	}
	else
	{
		str[i] = '\0';
	}
	_reverse(str);
	return str;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一尺丈量

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值