中易网

用定长存储方式实现字符串的基本操作(10个函数)

答案:5  悬赏:80  
解决时间 2021-03-12 04:42
在下面的再加7个函数,在数据结构上用C语言做
#include<stdio.h>
#include<string.h>
char *Strcpy(char *s1,char *s2)
{
while(*s2!='\0')
*s1++=*s2++;
*s1=*s2;
return s1;
}
char *Strcat(char *s1,char *s2)
{
char s[1000];
int i=0;
int len=strlen(s1);
while(*s1!='\0')
s[i++]=*s1++;
while(*s2!='\0')
s[len++]=*s2++;
s[len]=*s2;
return s;
}
int Strcmp(char *s1,char *s2)
{
if(strlen(s1)!=strlen(s2))
{
while(*s1==*s2)
{
s1++;
s2++;
}
return (*s1<*s2)==1?1:-1;
}
else
{
while(*s1!='\0'&&*s1==*s2)
{
s1++;
s2++;
}
if(*s1=='\0')
return 0;
else return (*s1<*s2)==1?1:-1;
}
}

void main()
{
char s1[20],s2[20]="hello!",s3[20]="bye!";
Strcpy(s1,s2);
printf("%d\n",Strcmp(s2,s3));
printf("%d\n",Strcmp(s3,s2));
printf("%d\n",Strcmp(s2,s1));
printf("%s\n",s1);
printf("%s\n",Strcat(s1,s2));
}

在上面的3个函数上加下面的7个

strequal:判串相等
strlength:求串长
substr:求子串
insstr:插入
delstr:删除
repstr:替换
dispstr:串输出
最佳答案
#include <assert.h>
#include <stdio.h>

//计算字符串str的长度一
int strlen(const char* str)
{
int i = 0;
while(*(str+i) != '\0')
{
i++;
}
return i;
}

//将字符串src copy 到 des中 二
char* strcpy(char* des, const char* src)
{
assert((des!=NULL)&&(src!=NULL));//确认des和src均不是空指针

char* desAddress = des;

//copy
while ((*des++ = *src++) != '\0')
{
NULL;
}

return desAddress;
}

//将src连接到des后面 三
char* concat(char* des, const char* src)
{

char* desAddress = des;

//des指针移动到最后
while (*des++ != '\0')
{
NULL;
}

//指针后退一位,指向'\0'的位置
des--;

//concat
while ((*des++ = *src++) != '\0')
{
NULL;
}

return desAddress;
}

//截取src的第s到e个字符,将得到的子串返回 四
char* SubStr(char* des, const char* src, int s, int e)
{
assert((des != NULL) && (src != NULL));

char* desAddress = des;

//如果e的值超出字符串的长度,则截取从s到字符串最后的字符
int maxlength = (int)strlen(src);
if (e > maxlength)
{
e = maxlength;
}

//得到从e开始到s的长度为e-s的字符串
int tk = 0;
while (tk <= e-s)
{
*(des+tk) = *(src+tk+s);
tk++;
}

//结束字符串
*(des+tk) = '\0';

return desAddress;
}

//将src插入到des的第p个字符之后 五
char* InsStr(char* des, const char* src, int p)
{
assert((src != NULL) && (des != NULL) && (p >= 0));

char* desAddress = des;

//如果位置p超出字符串的最大长度,则直接将src连接到des后面
if (p >= (int)strlen(des))
{
concat(des,src);
return desAddress;
}

int srcLength = (int)strlen(src);

//存储第p个字符后面的字符串,存储在tempps中
char* tempps = new char[strlen(des)-p+1];
strcpy(tempps,des+p);

//指针pps指向第p+1个字符
char* pps = des+p;

//将src copy到第p个字符后面
while ((*pps++ = *src++) != '\0')
{
NULL;
}

//指针前移一位,指向字符串结束符'\0'
pps--;

//循环,将tempps copy 到pps后面,此时pps指向des+p+srcLength-1
while ((*pps++ = *tempps++) != '\0')
{
NULL;
}
//pps--;
//strcat(pps,tempps);

return desAddress;
}

//交换两个字符
void swap(char& sc, char& dc)
{
char temp = sc;
sc = dc;
dc = temp;
}

//交换字符串str中的第i,j个字符,以字符串数组返回 六
char* repstr(const char* str, const int i, const int j)
{
assert(str != NULL);
char* dstr = new char[strlen(str)+1];
strcpy(dstr,str);
swap(*(dstr+i),*(dstr+j));

return dstr;
}

//倒置字符串,例如将"abcdef"变为"fedcba" 七
char* strrev(char* str)
{
assert(str != NULL);
int len = (int)strlen(str);
char* p = str;
char* data = new char[len+1];
//char* q = data;
//while (*p++ != '\0')
//{
// NULL;
//}
//p--;
//while((*data++ = *p--) != NULL)
//{
// NULL;
//}
/
if ((*(str+i) != ' ') && (i != 0)) continue;
else
{//找到空格
s = i + 1;
if (i == 0)//如果处理到第一个字符
{
s = i;
}
//将获得的单词(源串中从第s到第e个字符)
for (int j = s; j < e; j++)
{
*(data+k++) = *(str+j);
}
*(data+k++) = ' ';//补齐空格
e = i;
}
}
*(data+k) = '\0';
return data;
}

//从一个字符串中删除另一个字符串中出现的字符 九
char* delstr(char* str, const char* src)
{
assert((str != NULL) && (src != NULL));

int len = (int)strlen(str);
char* data = new char[len+1];
char* p = data;

//对原数据进行一个copy,防止源数据为只读
while ((*data++ = *str++) != '\0')
{
NULL;
}

char* res = p;
int srclen = (int)strlen(src);

while (*res != '\0')//对源串进行循环
{
for (int i = 0; i < srclen; i++)//依次与src中的每个字符进行比较
{
if (*res == *(src+i))//如果当前字符与src中的某个字符相等
{
int i = 0;
while (*(res+i) != '\0')//将当前字符后面的所有字符前移一位
{
*(res+i) = *(res+i+1);
i++;
}
}
}
res++;
}
return p;
}

//判读一个字符是否在一个字符串中,如果在,返回字符在字符串中首次出现的下标,否则返回-1 十
int IsExistInString(const char* str,char c)
{
assert(str != NULL);

int i = 0;
while (*(str+i) != '\0')
{
if (*(str+i) == c)
{
return i;
}
i++;
}
return -1;
}

int main()
{
char* ch = new char[50];
ch[0]='h';
ch[1]='a';
ch[2]='p';
ch[3]='p';
ch[4]='y';
ch[5]='\0';
char*dch = new char[50];
dch[0] = 'm';
dch[1] = 'n';
dch[2] = '3';
dch[3] = '\0';
char*cat=strrev(dch);
char* catc =InsStr(dch,ch,1);
printf("%s\n",cat);
printf("%s\n",catc);
char*cch = new char[50];
strcpy(cch,ch);
printf("%s\n",cch);
char* tc = strrev(ch);
printf("%s\n",tc);
int i = IsExistInString(ch,'a');
printf("%d\n",i);
char*tch=new char[50];
tch[0]='h';
tch[1]='a';
tch[2]='p';
tch[3]='p';
tch[4]='y';
tch[5]=' ';
tch[6]='n';
tch[7]='e';
tch[8]='w';
tch[9]=' ';
tch[10]='y';
tch[11]='e';
tch[12]='a';
tch[13]='r';
tch[14]='\0';
char*dc=repstr(tch,1,3);
printf("%s\n",dc);
char*oc=wordrev(tch);
printf("%s\n",oc);
char*ac=delstr(tch,ch);
printf("%s\n",ac);

}
全部回答
都不难,自己写吧。 不会了再来问,别自己一点都不考虑就依赖别人的帮忙!
# include #define ok 1 #define error 0 #define overflow -1 //-----串的堆分配储存表示----- typedef struct{ char *ch; //若是非空串,则按串长分配储存区,否则ch为null int length; //串长度 }hstring; //- - - - - 基本操作的算法描述 - - - - - //1.生成一个其值等于串常量chars的串t int strassign(hstring &t, char* chars){ int len = strlen(chars); //求串chars的长度len if(t.ch) free(t.ch); //若t存在则释放t原有的空间 if(!len){ t.ch = null; t.length = 0; } else{ if(!(t.ch = (char *)malloc((len+1)* sizeof(char)))) exit(0); strcpy(t.ch,chars); //调用系统原有函数复制字符串,给t赋值 t.length = len; } return 0; } //2.比较字符串 //若s>t,则返回值>0,若s=t,则返回值=0,若s
  • 3楼网友:你好陌生人
  • 2021-03-12 02:49
#include<stdio.h> #include<string.h> char *Strcpy(char *s1,char *s2) { while(*s2!='\0') *s1++=*s2++; *s1=*s2; return s1; } char *Strcat(char *s1,char *s2) { char s[1000]; int i=0; int len=strlen(s1); while(*s1!='\0') s[i++]=*s1++; while(*s2!='\0') s[len++]=*s2++; s[len]=*s2; return s; } int Strcmp(char *s1,char *s2) { if(strlen(s1)!=strlen(s2)) { while(*s1==*s2) { s1++; s2++; } return (*s1<*s2)==1?1:-1; } else { while(*s1!='\0'&&*s1==*s2) { s1++; s2++; } if(*s1=='\0') return 0; else return (*s1<*s2)==1?1:-1; } } void main() { char s1[20],s2[20]="hello!",s3[20]="bye!"; Strcpy(s1,s2); printf("%d\n",Strcmp(s2,s3)); printf("%d\n",Strcmp(s3,s2)); printf("%d\n",Strcmp(s2,s1)); printf("%s\n",s1); printf("%s\n",Strcat(s1,s2)); }
  • 4楼网友:萌萌哒小可爱
  • 2021-03-12 01:25
qmzxldksf(jdk2-hnb) djsk109(ghnx1+k12xz.) jvksdl102-fm,dkx.1 hxnbhsjcbmczmbncznx djskl1028jfx idlgi;skfs;9(l2sx,sl@=dkcn) gfidlfkvs./,m lerf411 jf,.cx,dsl.riefks(&jNsaj101fgdS) dsjkl.f 02ds9djsc(,jdszk^) fnxsdmf,sjnvglfk,.423$ fudjsk,.kl.ksld;. krg;'sdfk1035461 dfiuzl102,5-|.dsklc jfds.kfl.zkda/;s105463
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯