1.实现基本的c语言库函数:

int myStrlen( const char* str);//根据传入的字符串首地址获取字符串长度;返回值为长度

int myStrlen(const char* str)

{

if (str == NULL)

return 0;

int length=0;

while (*str != '\0')

{

length++;

str++;

}

return length;

}

void* myStrcpy(char* des, const char* source);//复制source到des

void* myStrcpy(char* des, const char* source)
{
if (des == NULL || source == NULL)
return NULL;
char *desbak = des;
while (((*des++) = (*source++)) != '\0');
*des = '\0';
return desbak;
}

void * myStrcat(char* des, const char *source);//将source添加到des的末尾

void * myStrcat(char* des, const char *source)
{
if (source == NULL || des == NULL)
return NULL;
if (myStrlen(source) == 0)
return des;
des = (char*)realloc(des, myStrlen(des) + myStrlen(source) + 1);

int i = myStrlen(des);
while (*source != '\0')
{
*(des + i) = *source;
i++;
source++;
}
*(des + i) = '\0';
return des;
}

char* myStrrev(const char* str); //字符串逆转

char* myStrrev(const char* str)
{
int i = 0;
int len = myStrlen(str);
char* res = (char*)calloc(len+1,sizeof(char));
*(res + len) = '\0';
for (i = len - 1; i >= 0; i--,str++)
{
*(res + i) = *str;
}
return res;
}

int str2int(const char* str);//将整数字符串转化为整数;返回值为结果整数,失败返回-1

int str2int(const char* str)
{
if (str == NULL)
return -1;
char* strbak = str;
int res = 0;
while (*str != '\0')
{
if (*str<'0' || *str>'9')
{
return -1;
}
str++;
}
str = strbak;
while (*str != '\0')
{
res *= 10;
int temp = *str - 48;
res += temp;
str++;
}
return res;
}

char* int2str(int num);//将正整数转化为字符串,返回字符串首地址

char* int2str(unsigned int num)
{
int numbak = num;
int n=0;//计算int位数
while (num != 0)
{
n++;
num /= 10;
}
char* res = (char*)calloc(n+1,sizeof(char));
char* resbak=res;
num = numbak;
while (num != 0)
{
*res = num % 10 + 48;
res++;
num /= 10;
}
*res = '\0';
resbak = myStrrev(resbak);
return resbak;
}

2.根据上面编写的库函数,实现一些扩展的功能:

typedef struct _myString //定义字符串结构体,包括字符串及其长度

{

char *p;

int length;

} myString;

int initString(myString *string, char* str);//初始化字符串

int initString(myString *string, char* str)
{
if (str == NULL)
return -1;
int length = myStrlen(str);

string->p = (char*)calloc(length + 1,sizeof(char));
myStrcpy(string->p,str);
string->length = length;
return 1;
}

void * findChar(const myString *string, const char findCh);//找到特定的字符,返回首地址

void * findChar(const myString *string, char findCh)
{
char* s = string->p;
while (*s != '\0')
{
if (*s== findCh)
return s;
s++;
}
return NULL;
}

void * findString(const myString *string,const char* findStr);//找到字符串,返回首地址,找不到返回null

void * findString(const myString *string,const char* findStr)
{
if (NULL == findStr)
return NULL;
if (myStrlen(findStr) > myStrlen(string->p))
return NULL;

char* s = string->p;
char*sp = NULL;

int i = 0,j=0;
for (i = 0; i < string->length - 1; i++)
{
char* fs = findStr;
if (*(s + i) == *(fs))
{
sp = s + i;
for (j = 0; j < myStrlen(findStr) - 1; j++)
{
sp++;
fs++;
if (*sp != *fs)
break;
}
if (j ==myStrlen(findStr) - 1)
return s + i;
}
}
return NULL;
}

int addChar(myString *string, char addCh, char* pos);//pos为null则在string的后面添加,否则在指定位置添加一个字符;返回-1表示操作失败

int addChar(myString *string, char addCh, char* pos)//pos为NULL表示在字符串后面添加
{
if (pos == NULL)
{
//string->p = (char *)realloc(string->p, string->length + 2);
myStrcat(string->p, &addCh);
string->length += 1;
return 1;
}

if (pos<string->p || pos>string->p + string->length)
return -1;

int i = string->length , addLength = pos-string->p ;
string->p = (char *)realloc(string->p,string->length+2);
char *s = string->p;
*(s + i +1) = '\0';

for (i = string->length ; i > addLength; i--)
{
*(s + i) = *(s+i-1);
}
*(s + i) = addCh;
string->length += 1;
return 1;
}

int addString(myString *string, const char* addStr, char* pos);//pos为null则在string的后面添加,否则在指定位置添加一个字符串;返回-1表示操作失败

int addString(myString *string, const char* addStr, char* pos)
{
if (pos == NULL)
{
myStrcat(string->p, addStr);
string->length += myStrlen(addStr);
return 1;
}

if (pos<string->p || pos>string->p + string->length||addStr==NULL)
return -1;

string->length += myStrlen(addStr);

int i = string->length+myStrlen(addStr), addLength = pos - string->p;
string->p = (char *)realloc(string->p, string->length +myStrlen(addStr)+1 );
char *s = string->p;
*(s + i ) = '\0';

for (i = string->length+myStrlen(addStr)-1; i > addLength; i--)
{
*(s + i) = *(s + i - myStrlen(addStr));
}
while (*addStr != '\0')
{
*(s + i) = *addStr;
i++;
addStr++;
}

return 1;
}

void deleteChar(myString *string,char deleteCh,int tag);//tag为1,则删除所有的指定字符;否则,只删除第一个

void deleteChar(myString *string, char deleteCh,int tag)
{
char * pos = (char*)findChar(string, deleteCh);
if (pos == NULL)
return ;

while (*pos != '\0')
{
*pos = *(pos+ 1);
pos++;
}
string->length -= 1;
if (tag == 1)
{
while (findChar(string, deleteCh) != NULL)
deleteChar(string, deleteCh,1);
}
}

void deleteString(myString *string,const char *deleteStr,int tag);//tag为1,则删除所有的指定字符;否则,只删除第一个;

void deleteString(myString *string, const char *deleteStr,int tag)
{
char * pos = (char*)findString(string, deleteStr);
if (pos == NULL)
return;

while (*(pos+myStrlen(deleteStr)-1) != '\0')
{
*pos = *(pos + myStrlen(deleteStr));
pos++;
}
string->length -= myStrlen(deleteStr);
if (tag ==1)
{
while (findString(string, deleteStr) != NULL)
deleteString(string, deleteStr,1);
}
}

void updateChar(myString *string,char oldCh,char newCh);//更新一个字符

void updateChar(myString *string, char oldCh, char newCh)
{
char* pos;
if ((pos = findChar(string, oldCh)) == NULL)
return;
*pos = newCh;
while (findChar(string, oldCh) != NULL)
updateChar(string,oldCh,newCh);
}

void updateString(myString *string, char* oldStr, const char* newStr);//更新字符串

void updateString(myString *string, char* oldStr, const char* newStr)
{
if (newStr == NULL)
return;
char* pos;
if ((pos = findString(string, oldStr)) == NULL)
return;
deleteString(string,oldStr,0);
addString(string,newStr,pos);
while (findString(string, oldStr) != NULL)
{
updateString(string,oldStr,newStr);
}
}

自己用c语言实现字符串处理库函数以及扩展的更多相关文章

  1. C语言之字符串替换库函数replace

    头文件 #include <algorithm> 例子 下面的代码, 将字符串中的 /替换为\ std::string str("C:/demo/log/head/send&qu ...

  2. C语言中的字符串处理库函数介绍与实现

    一.介绍 本文将主要介绍字符串处理库函数中的strlen.strcpy.strcat.strcmp.atoi等,主要由<string.h>头文件提供. 二.strlen函数:求字符串的长度 ...

  3. C语言分割字符串

    最近在做一道C语言题目的时候需要用到分割字符串,本来想自己手写的,也不会很麻烦,但想到其他语言都有分割字符串的库函数,C语言怎么会没有呢?所以,在网上搜了一搜,果然有这样的函数,还是很好用的,在此总结 ...

  4. R语言拆分字符串

    R语言拆分字符串 aaa<-"aa;bb;cc"ccc<-strsplit(aaa,split=";") bbb<- unlist(strsp ...

  5. C语言之字符串处理函数

    C语言中字符串处理函数介绍 下面介绍8种基本的常用的字符串处理函数,在数值数组中也常常用到(部分函数).所有的C语言编译系统中一般都提供这些函数. 1.puts函数——输出字符串的函数 一般的形式为p ...

  6. Swift3.0语言教程字符串与URL的数据转换与自由转换

    Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...

  7. Swift3.0语言教程字符串与文件的数据转换

    Swift3.0语言教程字符串与文件的数据转换 Swift3.0语言教程字符串与文件的数据转换,如果想要对字符串中的字符进行永久保存,可以将字符串中的字符写入到文件中.当然,开发者也可以将写入的内容进 ...

  8. Swift3.0语言教程字符串转换为数字值

    Swift3.0语言教程字符串转换为数字值 Swift3.0语言教程字符串转换为数字值,在NSString中,开发者可以将字符串转换为数字值,通过这些数字值可以实现一些功能,如加法运算.减法运算等.数 ...

  9. Swift3.0语言教程字符串大小写转化

    Swift3.0语言教程字符串大小写转化 Swift3.0语言教程字符串大小写转化,在字符串中,字符串的格式是很重要的,例如首字母大写,全部大写以及全部小写等.当字符串中字符很多时,通过人为一个一个的 ...

随机推荐

  1. 人类大脑只开发了10%? I don't think so.

    既然程序执行时有些部分是彼此互斥的(在程序的一次执行中,执行了这部分就不会去执行另一部分),那么所谓的 人类大脑只开发了10%? 是不是其实只是程序互斥的一种体现. 而往往"智商" ...

  2. mysql coalesce函数

    COALESCE函数从值列表中返回第一个非NULL的值,当遇到NULL值时将其替换为0. coalesce(str1,str2....); e.g.   需要在表中查出所有比'WARD'提成(COMM ...

  3. Eclipse动态web工程(Dynamic Web Project)添加jar文件的正确方法

    Eclipse中,创建了动态web工程之后,如果需要添加新的jar文件,有两种方法.第一种是配置工程的“build path”,第二种则是将jar文件放在工程目录下的“/WebContent/WEB- ...

  4. (转)LINUX测试环境部署Redis(四)

    安装配置Redis 第一部分:安装redis  希望将redis安装到此目录 1 /usr/local/redis 希望将安装包下载到此目录 1 /usr/local/src 那么安装过程指令如下: ...

  5. win10突然不能使用usb大容量存储设备(移动硬盘)的解决方法

    昨天开始使用usb硬盘,发现一块无法识别,一块识别好了以后不能打开. 可能是之前一次系统更新有bug,但是一直也没有用移动硬盘,所以没有发现. 开始尝试各种方案,已经尝试过并且无效的有以下几个: 1, ...

  6. 2016HUAS_ACM暑假集训4C - 递推

    题目大意:给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形. 这里我们可以这样看: 对于行:假如是m单位长度,则长度为1的矩形有m个,长度为2的矩形有m-1个......长度为m的只有1 ...

  7. 【OpenGL】VAO与VBO

    1.我们先了解什么是OpenGL对象(OpenGL Object) 根据OpenGL Wiki的定义: An OpenGL Object is an OpenGL construct that con ...

  8. 1.13 linux笔记

    free -m 看内存脚本 rpm -ivh 显示过程 rpm -U --upgraderpm -F --freshenrpm -e --eraserpm -e koren find / -name ...

  9. HttpServletRequest常用获取URL的方法

    1.request.getRequestURL() 返回的是完整的url,包括Http协议,端口号,servlet名字和映射路径,但它不包含请求参数.2.request.getRequestURI() ...

  10. 在树莓派(Raspberry Pi)上编译安装更新版本的Python

    Raspiban Wheezy上预装的Python3版本是3.2.3,本文将介绍升级到3.4.3的方法. 此文也适用于安装其它版本(比如最新版本)的Python. 我用的是B+型的树莓派,装的系统是2 ...