字符串操作.docx
《字符串操作.docx》由会员分享,可在线阅读,更多相关《字符串操作.docx(17页珍藏版)》请在冰豆网上搜索。
![字符串操作.docx](https://file1.bdocx.com/fileroot1/2022-11/24/43a076e8-b80d-4e25-940e-736b9fb99caf/43a076e8-b80d-4e25-940e-736b9fb99caf1.gif)
字符串操作
#include"string.h"
//初始化
void init(mystring*string)
{
string->p=NULL;
string->realLength=0;
}
voidinitWithLength(mystring*string,intlength)//开辟长度 内存清0
{
string->p=(char*)calloc(length,sizeof(char));//分配内存并清0
string->realLength=length;
}
voidinitWithString(mystring*string,char*copystring)//初始化字符串并拷贝
{
if(NULL==string)
{
printf("字符串为空,无法拷贝\n");
return0;
}
intlength=strlen(copystring);//获取字符串长度
string->p=(char*)calloc(length+1,sizeof(char));//由于此处的calloc已经全部初始化为0 所以下面的操作不需要考虑字符串结束标志
//strcpy(string->p,copystring);//拷贝字符串
mystrcpy(string->p,copystring);
string->realLength=length+1;//设置长度
}
//显示字符串
voidshowString(mystring*string)
{
printf("showString=%s\n",string->p);
}
//获取字符串长度
intmystrlen(char*p)
{
intlength=0;
if(NULL==p)
{
printf("字符串为空\n");
return0;
}
while(*p!
='\0')
{
length++;
p++;
}
returnlength;
}
//字符串拷贝
char*mystrcpy(char*dest,constchar*source)
{
if(NULL==dest&&NULL==source)
{
printf("字符串为空\n");
returnNULL;
}
char*destbak=dest;
while(*source!
='\0')
{
*dest=*source;//字符赋值
source++;
dest++;//指针前移
}
*dest='\0';
returndestbak;//返回地址
}
char*mystrcat(char*dest,constchar*source)
{
if(!
dest||!
source)
{
printf("字符串为空,插入失败\n");
returnNULL;
}
else
{
char*destbak=dest;//保留地址
while((*destbak++)!
='\0');//指针前移
while((*dest++)!
='\0')//循环并拷贝字符串
{
*dest=*source;
dest++;
source++;
}
*dest='\0';
returndestbak;
}
}
//内部字符串当做指令来处理
voidrun(mystring*string)
{
system(string->p);//执行指令
}
//查找字符串中第一个找到的字符 strchr
char*findFirstChar(mystring*string,charch)
{
char*p=mystrchr(string->p,ch);//使用自定义函数
returnp;
}
char*mystrchr(constchar*dest,const charch)
{
if(NULL==dest)
{
returnNULL;
}
while(*dest++!
='\0')
{
if(*dest==ch)
{
returndest;//找到就返回地址
}
}
returnNULL;//没找到返回NULL
}
//查找字符串 strstr
char*findFirstString(mystring*string,char*str)//返回第一个找到的字符串地址
{
char*pres=mystrstr(string->p,str);
returnpres;//返回找到字符串的地址
}
char*mystrstr(constchar*constdest,constchar*constfindstr)//避免传递过来的字符串以及地址被随便修改
{
//判断为空 很重要
if(NULL==dest||NULL==findstr)
{
returnNULL;
}
char*destbak=dest;
char*p=NULL;//保存找到的字符串地址
while(*destbak!
='\0')
{
intflag=1;
char*findstrbak=findstr;
char*nowdestbak=destbak;
while(*findstrbak!
='\0')
{
if(*nowdestbak!
='\0')
{
if(*findstrbak++!
=*nowdestbak++)
{
flag=0;//不等
}
}
else
{
flag=0;
break;
}
}
if(1==flag)
{
p=destbak;
returnp;
}
destbak++;
}
returnNULL;
}
//删除字符、字符串
intdeleteFirstChar(mystring*string,constcharch)
{
//查找
char*pstr=mystrchr(string->p,ch);
if(NULL==pstr)
{
return0;
}
char*pnext=pstr+1;
//双指针循环
while(*pnext!
='\0')
{
*pstr++=*pnext++;//ok
}
*pstr='\0';
return1;
}
intdeleteFirstString(mystring*string,char*conststr)
{
char*pres=mystrstr(string->p,str);
if(NULL==pres)
{
return0;
}
else
{
intlength=mystrlen(str);//字符串长度
char*pnext=pres+length;
while(*pnext!
='\0')
{
*pres++=*pnext++;
}
*pres='\0';//字符串结尾结束标志
return1;
}
}
//尾部增加 字符、字符串
voidbackAddChar(mystring*string,charch)
{
if(strlen(string->p)+1==string->realLength)
{
//重新分配内存
string->p=realloc(string->p,string->realLength+1);
string->realLength+=1;
string->p[string->realLength-2]=ch;
string->p[string->realLength-1]='\0';
}
else
{
intnowlength=mystrlen(string->p);//求出当前长度
string->p[nowlength]=ch;
string->p[nowlength+1]='\0';
}
}
voidbackAddString(mystring*string,char*str)
{
intnowmyStringLength=mystrlen(string->p);//获取当前字符串长度
intaddStringLength=mystrlen(str);//要增加字符串的长度
if(nowmyStringLength+addStringLength+1>string->realLength)
{
intneedAddLength=nowmyStringLength+addStringLength+1-string->realLength;
//分配内存
string->p=(char*)realloc(string->p,string->realLength+needAddLength);//增加字符串长度
mystrcat(string->p,str);//字符串拼接
string->realLength+=needAddLength;//增加长度
}
else
{
mystrcat(string->p,str);//拼接字符串
}
}
//任意位置增加(字符、字符串) 根据地址
voidaddChar(mystring*string,charch,char*pos)
{
if(NULL==pos||NULL==string)
{
returnNULL;
}
if(mystrlen(string->p)+1==string->realLength)
{
//重新分配内存
string->p=realloc(string->p,string->realLength+1);
string->realLength+=1;
intnowlength=mystrlen(string->p);
intmovelength=mystrlen(pos);
for(int i=nowlength; i>nowlength-movelength;i--)
{
string->p[i]=string->p[i-1];
}
string->p[nowlength-movelength]=ch;//插入
}
else
{
intnowlength=mystrlen(string->p);//求出当前长度
intmovelength=mystrlen(pos);//求出现在要移动的长度
for(inti=nowlength;i>nowlength-movelength;i--)
{
string->p[i]=string->p[i-1];
}
string->p[nowlength-movelength]=ch;
string->p[nowlength+1]='\0';
}
}
voidaddString(mystring*string,char*str,char*pos)
{
if(NULL==pos||NULL==string)
{
return;
}
intnowmystringlength=mystrlen(string->p);//获取当前长度
intaddstringlength=mystrlen(str);//要增加的字符串长度
if(nowmystringlength+addstringlength+1>string->realLength)//判断是否
{
string->p=(char*)realloc(string->p,string->realLength+needaddlength);
string->realLength+=needaddlength;//增加长度
intnowlength=mystrlen(string->p);//求出当前的长度
intmovelength=mystrlen(pos);//求出现在要移动的长度
intinsertlength=mystrlen(str);//要求出插入的长度
for(inti=nowlength;i>=nowlength-movelength;i++)
{
string->p[i+insertlength]=string->p[i];//字符移动
}
for(intj=0;j {
string->p[nowlength-movelength+j]=str[j];//赋值拷贝
}
}
else
{
intnowlength=mystrlen(string->p);//求出当前的长度
intmovelength=mystrlen(pos);//求出现在要移动的长度
intinsertlength=mystrlen(str);//要求出插入的长度
for(inti=nowlength;i>=nowlength-movelength;i++)
{
string->p[i+insertlength]=string->p[i];//字符移动
}
for(intj=0;j {
string->p[nowlength-movelength+j]=str[j];//赋值拷贝
}
}
}
//任意位置修改(字符、字符串) 根据地址
voidchangeFirstChar(mystring*string,constcharoldchar,constcharnewchar)
{
char*pstr=string->p;
while(*pstr!
='\0')
{
if(*pstr==oldchar)
{
*pstr=newchar;
return;//如果套替换所有的字符 去掉return即可
}
pstr++;
}
}
voidchangeFirstString(mystring*string,char*constpoldstr,char*constpnewstr)
{
char*pfind=findFirstString(string,poldstr);
if(NULL!
=pfind)
{
deleteFirstString(string,poldstr);
addString(string,pnewstr,pfind);
}
}
3. [文件] main.c ~ 2KB 下载(5)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include"string.h"
voidmain1()
{
mystringstring1;
//函数内部改变外部变量需要地址
initWithString(&string1,"mynameisrocket");
showString(&string1);
printf("字符串长度:
%d\n",mystrlen(&string1));
getchar();
}
voidmain2()
{
mystringstring1;
// initWithString(&string1,"cal");
// showString(&string1);
// //增加字符
// backAddChar(&string1,'c');
// run(&string1);
//增加字符串
initWithString(&string1,"note");
showString(&string1);
backAddString(&string1,"pad");
showString(&string1);
run(&string1);
getchar();
}
//测试字符查找函数strchr
voidmain3()
{
mystringstring1;
initWithString(&string1,"calaaaa");
showString(&string1);
//修改 将找到的一个字符a改为A
char*pstr=findFirstChar(&string1,'a');
*pstr='A';
showString(&string1);
getchar();
}
//测试strstr mystrstr
void main4()
{
mystringstring1;
initWithString(&string1,"calaaaa");
showString(&string1);
char*pstr=findFirstString(&string1,"laz");
// printf("查找:
%s\n",*pstr);//error
printf("查找:
%s\n",pstr);
if(pstr!
=NULL)
{
*pstr='Z';
}
showString(&string1);
getchar();
}
//删除(字符、字符串)依赖于查找
voidmain5()
{
mystringstring1;