C语言常用字符串库函数实现
2015-08-11 16:08
417 查看
早闻写技术博客的N种功效,将理解的东西写出来,既满足了自己的自豪感,还能让藏在民间的高手指出不足或错误之处,实及一大好事。虽为一学生,无工作、缺女友,但还是诸事烦身,博客也已许久没有加入新的文章了。今已是奔“四”之人,快来面临找工作之困,也早闻大的IT公司都重视基础(C/C++、数据结构、算法、计算机网络、数据库),还会有面试时写个算法什么的,特别是一个简单的C库函数......现在自己实现了一些C字符串库函数,现将其放到博客上,以纪念那些打代码的时光。
首先是头文件(cbaselib.h)为有别区于库函数,所有函数名都以“_”开始
下面是实现(cbaselib.c)
这里特别注意的一个是_itoa函数,这个函数会在内部动态申请一个内存块,用于存放转换后的字符串。使用完成后一定要记得手动释放它。否则使用下面的_itoa函数会加安全。
首先是头文件(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; }
相关文章推荐
- C++基础知识点
- [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal
- Here's what C++ is
- 智能指针的使用
- C++ Primer 学习笔记_38_STL实践与分析(12)--集成的应用程序容器:文本查询程序
- 黑马程序员——C语言笔记之scanf函数及使用注意事项
- 用C语言判断一个二叉树是否为另一个的子结构
- c++ stl泛型(一)
- c/c++ mfc创建目录,获取运行目录
- C++ Builder XE8安卓开发之实现左右滑屏切换标签(Tab)功能
- C++ 多线程拷贝文件(demo)
- Inventory
- 【effective c++读书笔记】【第6章】继承与面向对象设计(1)
- 【effective c++读书笔记】【第6章】继承与面向对象设计(1)
- HDU 1312 Red and Black
- C++/STL_中vector基本操作测试代码,vector.erase()使用方法
- 黑马程序员——C语言笔记之printf函数与格式控制符
- ACdream 1726
- C++_重载运算符<< ostream流重载注意事项_使自定义数据可以用cout输出
- 黑马程序员——C语言笔记之数据类型与常量