您的位置:首页 > 编程语言 > C语言/C++

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

2015-08-11 16:08 417 查看
早闻写技术博客的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: