字符串定义操作(C语言)
2015-02-27 22:01
162 查看
#include<stdio.h> #include<stdlib.h> typedef struct Cstring { char *p;//字符串 int nLength;//字符串实际长度(+'\0') }mystring; int mystrlen(char *str)//字符串长度 { int length=0; if(str==NULL)//字符串为空返回-1 { return -1; } while(*str!='\0')//判断字符串是否到结尾 { str++;//指针移动 length++;//长度+1 } return length; //返回字符串长度 } char *mystrcpy(char *str,char *copystr)//拷贝字符串 { char *strbak=str;//记录首地址 if(str==NULL||copystr==NULL)//字符串为空返回 { return NULL; } while(*copystr!='\0')//判断要拷贝的字符串是否到结尾 { *str=*copystr;//拷贝字符 str++;//指针移动 copystr++; } *str='\0';//字符串结尾 return strbak;//返回首地址 } char *mystrcat(char *allstr,char *str)//链接字符串 { char *allstrbak=allstr;//记录字符串首地址 if(allstr==NULL||str==NULL)//字符串为空返回空 { return NULL; } while(*allstr!='\0')//要拷贝的字符串走到最后'\0' { allstr++;//指针移动 } while(*str!='\0') { *allstr=*str;//字符串拷贝 allstr++; str++; } *allstr='\0';//字符串结尾 return allstrbak;//返回首地址 } char *mystrchr(char *allstr,char ch)//查找字符 { if(allstr==NULL)//字符串为空返回空 { return NULL; } while(*allstr!='\0')//遍历字符串 { if(*allstr==ch)//判断是否找到 { return allstr;//返回地址 } allstr++;//指针移动 } return NULL;//没找返回空 } char *mystrstr(char *allstr,char *str)//查找字符串 { char *allstrbak=allstr;//记录长串的首地址 char *strbak=NULL; char *nowallstrbak=NULL; int flag; if(allstr==NULL||str==NULL)//字符串为空返回空 { return NULL; } while(*allstrbak!='\0')//遍历长字符串匹配 { nowallstrbak=allstrbak;//从长字符串每一个字母作为开始 strbak=str;//记录短字符串的首地址 flag=1;//假定是匹配成功的 while(*strbak!='\0'&&*nowallstrbak!='\0')//从某一个长字符串的地址开始,从短字符串首地址开始遍历 { if(*strbak!=*nowallstrbak)//如果不等 { flag=0;//停止 break; } strbak++;//指针移动 nowallstrbak++; } if(flag==1)//如果匹配成功 { return allstrbak;//返回首地址 } allstrbak++;//改变从长字符串的地址开始 } return NULL;//匹配不成功,返回空 } void init(mystring *string) { string->p=NULL; string->nLength=0; } void initwithlength(mystring *string,int length) { string->p=(char *)malloc(sizeof(char)*length); string->nLength=length; } void initwithstring(mystring *string,char *copystring) { int length=mystrlen(copystring);//要初始化字符串长度 string->p=(char *)calloc(length+1,sizeof(char));//分配内存(字符串长度+'\0‘) mystrcpy(string->p,copystring);//拷贝字符穿 string->nLength=length+1;//字符串实际长度(+'\0') } void backaddchar(mystring *string,char ch)//在字符串后面添加一个字符 { if(mystrlen(string->p)+1==string->nLength)//要拷贝的字符串长度+1(就是+'\0')==字符串的实际长度,意味满了 { string->p=(char *)realloc(string->p,string->nLength+1);//重新分配内存,见其实际长度+1(加一个字符的长度) string->nLength+=1;//字符串的长度+1(注意要首先+1) string->p[string->nLength-2]=ch;//数组下表与实际长度要-1 string->p[string->nLength-1]='\0'; } else { int length=mystrlen(string->p);//字符串长度 string->p[length]=ch;//储存字符 string->p[length+1]='\0';//结尾 } } void backaddstring(mystring *string,char *str)//在字符串后面添加字符串 { int nowmystringlength=mystrlen(string->p);//现在字符串长度(没加'\0') int addstringlength=mystrlen(str);//需要增加字符串长度(没加'\0') if(nowmystringlength+addstringlength+1>string->nLength)//判断字符串长度是否足够 { int needaddstringlength=nowmystringlength+addstringlength+1-string->nLength;//需要增加字符串长度 string->p=(char *)realloc(string->p,string->nLength+needaddstringlength);//重新分配内存 mystrcat(string->p,str);//连接字符串 string->nLength+=needaddstringlength;//字符串实际长度+增加长度 } else { mystrcat(string->p,str);//够长连接字符串 } } char *findfirstchar(mystring *string,char ch)//查找第一个字符的地址 { char *p=mystrchr(string->p,ch); return p; } char *findfirststr(mystring *string,char *str)//查找第一个字符串的地址 { char *p=mystrstr(string->p,str); return p; } int deletefirstchar(mystring *string,char ch)//删除第一个字符串 { char *p=mystrchr(string->p,ch);//找到第一个相同首字母的地址 if(p==NULL)//没找到返回0 { return 0; } else { char *pNext=p+1;//记录要删除字符的下一个字母的地址 while(*pNext!='\0')//字符整体向前移动 { *p=*pNext;//赋值 p++;//指针移动 pNext++; } *p='\0';//pNext到结尾时停止,字符串要有结尾 string->nLength-=1;//字符串实际长度-1 return 1; } } int deletefirststring(mystring *string,char *str)//删除第一个相同的字符串 { char *p=mystrstr(string->p,str);//找到第一个相同字符串的首地址 char *pNext=NULL; int length; if(p==NULL)//没找到返回0 { return 0; } else { length=mystrlen(str);//要删除字符串的长度 pNext=p+length;//找到要移动位置的地址 while(*pNext!='\0')//字符串向前移动 { *p=*pNext;//赋值 p++;//指针移动 pNext++; } *p='\0';//字符串结尾 string->nLength-=length;//字符串实际长度-删除字符串长度 return 1; } } void changefirstchar(mystring *string,char oldchar ,char newchar)//改变第一个与oldchar相同的字符,改变为newchar { char *pstr=string->p;//记录字符串的首地址 while(*pstr!='\0')//遍历字符串 { if(*pstr==oldchar)//如果与oldchar相同 { *pstr=newchar;//改变字符 return ;//跳出循环,返回 } pstr++;//指针移动 } } void addchar(mystring *string,char ch,char *pos) { int nowlength,movelength;//nowlength字符串长度movelength从pos位置后面要移动的长度 int i; if(pos==NULL||string==NULL)//如果位置为空或者字符串为空返回 { return ; } if(mystrlen(string->p)+1==string->nLength)//字符串长度+'\0'是否等于字符串实际长度(看是否满了) { string->p=(char *)realloc(string->p,string->nLength+1);//重新分配内存 string->nLength+=1;//字符串实际长度+1 nowlength=mystrlen(string->p); movelength=mystrlen(pos); for(i=nowlength;i>nowlength-movelength;i--) { string->p[i]=string->p[i-1];//移动不包括'\0' } string->p[nowlength-movelength]=ch;//添加字符串 string->p[nowlength+1]='\0';//字符串结尾 } else { nowlength=mystrlen(string->p); movelength=mystrlen(pos); for(i=nowlength;i>nowlength-movelength;i--) { string->p[i]=string->p[i-1]; } string->p[nowlength-movelength]=ch; string->p[nowlength+1]='\0'; } } void run(mystring *string)//执行指令 { system(string->p); } void printfstring(mystring *string)//打印字符串 { printf("%s\n",string->p); } void main() { mystring string; char *findch=NULL; char *findstr=NULL; int ok; int flag; char *pos; initwithstring(&string,"note"); //backaddchar(&string,'d');//在后面添加字符 backaddstring(&string,"pad5");//在后面添加字符串 ok=deletefirstchar(&string,'d'); changefirstchar(&string,'5','d'); deletefirstchar(&string,'a'); pos=findfirstchar(&string,'d'); addchar(&string,'a',pos); /*if(ok==0) { printf("No\n"); } else { printf("Yes\n"); } printf("%d\n",mystrlen(string.p)); printf("%d\n",string.nLength); backaddstring(&string,"pad"); flag=deletefirststring(&string,"pad"); printf("%d\n",mystrlen(string.p)); printf("%d\n",string.nLength); if(flag==0) { printf("No\n"); } else { printf("Yes\n"); } /*printf("%d\n",mystrlen(string.p));//字符串长度 findch=findfirstchar(&string,'o');//查找字符 if(findch==NULL) { printf("No\n"); } else { printf("%c\n",*findch); printf("Yes\n"); } findstr=findfirststr(&string,"tep");//查找字符串 if(findstr==NULL) { printf("No\n"); } else { printf("%s\n",findstr); printf("Yes\n"); }*/ printfstring(&string); run(&string); }
相关文章推荐
- Java:布尔值,字符范围,字符串声明,换行操作,常量定义与c语言的不同
- C语言中操作字符串的一些函数源代码
- 转贴 c语言中的字符串操作
- Linux下常用C语言字符串操作函数
- C语言中操作字符串的一些函数源代码
- C#中定义数组--字符串及数组操作
- C语言的字符串操作
- Linux下C语言之操作字符串函数介绍及实例之一
- c语言中的字符串操作函数
- C语言字符串操作(转)
- 用C语言定义Bool类型(包括数据表示和操作实现),至 少包含and(与)、or(或)、not(非)、equiv(相等)这4个操作。
- C语言中操作字符串的一些函数源代码
- C语言中操作字符串的一些函数源代码
- C语言字符串操作函数
- Linux下常用C语言字符串操作函数
- C语言中文件操作--如何将文本数据正确读到字符串数组中
- C语言中字符串操作要点
- C语言里面字符串操作是关于格式的参数
- C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
- C语言字符串操作常用库函数