字符串

MyString.h

//MyString.h

#ifndef MYSTRING_H
#define MYSTRING_H

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100

/**链表存储**/
typedef struct StrNode
{
	char ch;
	struct StrNode *next;
	int length;
}StrNode;

/******顺序表存储******/
typedef struct HString
{
	char ch[MAXSIZE];
	int length;
}HString;
void StrCreat(HString *T);//创建一个字符串,放入T中
void StrOut(HString *T);
void StrAssign(HString *T,char *chars);//生成一个其值等于常量chars的串T
int StrLength(HString S);//返回S的元素个数
int StrCompare(HString S,HString T);//两个串比较输出两串的长度差//如果两串相同,则输出111

void clearStr(HString *S);
void concat(HString *T,HString S1,HString S2);
void SubStr(HString *Sub,HString S,int pos,int len);//用sub返回串S的第pos个字符起长度为len的子串
												//Sub=(HString *)malloc(sizeof(HString));
int Index(HString S,HString T,int pos);//返回主串S中第pos个字符之后的存在与T
									//相等的第一个子串的 位置
void StrInsert(HString *S,int pos, HString T);//在串的的pos个字符之前插入串T
void StrDelete(HString *S,HString T);//从串S中删除与T相同所有的字符串
void StrReplace(HString *S,HString T,HString V);//用V替换S中所有T的字符
void StrCopy(HString *s,HString *h);

StrNode *LStrAssign();//链表创建一个字符串
void printStr(StrNode *S);//输出
void Strreplace(StrNode *S,StrNode T,StrNode V);//替换   ERROR

#endif

MyString.cpp

//

//MyString.cpp

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"MyString.h"

/***********************检测完毕************1****************/
void StrCreat(HString *T)//创建一个字符串,放入T中
{  

	char c;
	int j=0;
	printf("\n请输入一个字符串,以*作为结束:");
	scanf("%c",&c);
	while(c!='*' && j<MAXSIZE)
	{
		T->ch[j]=c;
		j++;
		scanf("%c",&c);
	}
	T->ch[j]='\0';
	T->length=j-1;

}

/***********************检测完毕**********2******************/
void StrOut(HString *T)
{
	printf("\n");
	printf("字符串是%s\t**长度是%d\n",T->ch,T->length);
}


void StrAssign(HString *T,char *chars)//生成一个其值等于常量chars的串T
{
	int i,j;char c[MAXSIZE];i=0;
	if(T->ch)free(T->ch);
	if(!(T=(HString *)malloc(sizeof(HString))))printf("ERROR");
	while(c[i]){c[i]=*chars;chars++;i++;printf(" %c ",c[i]);}
	if(i==0) printf("NULL");
	else{
		for(j=0;j<=i;j++)
		{T->ch[j]=c[j];}
		T->ch[j+1]='\0';
		T->length=i;

	}
}

int StrLength(HString S)//返回S的元素个数
{
	return (S.length);
}


/***************************检测完毕*********************/                                          
int StrCompare(HString S,HString T)//两个串比较输出两串的长度差
{                                  //如果两串相同,则输出111

	int i;i=0;

	while(i<S.length && i<T.length)
	{
		i++;
		if(S.ch[i]!=T.ch[i]) 
			return (S.length-T.length);
		else 
			return 111;//两个串相等,返回111
	}
}

void clearStr(HString *S)
{
	if(S->ch){free(S->ch);}//S->ch=NULL;}
	S->length=0;
}

/***************************检测完毕*********************/   
void concat(HString *T,HString S1,HString S2)//用T返回由S1和S2连接而成的新串
{

	int i;
	if(T->ch) free(T->ch);
	if(S1.length+S2.length<=MAXSIZE)
	{for(i=0;i<=S1.length;i++) {T->ch[i]=S1.ch[i];}
	for(i=S1.length+1;i<=S1.length+S2.length;i++)  {T->ch[i]=S2.ch[i-S1.length];}
	T->ch[S1.length+S2.length+1]='\0';
	T->length=S1.length+S2.length;
	}
	else printf("OVERFLOW");
}

/****************************检测完毕******************************/
void SubStr(HString *Sub,HString S,int pos,int len)
{//用sub返回串S的第pos个字符起长度为len的子串
	//Sub=(HString *)malloc(sizeof(HString));

	int i;
	if(pos<1 || pos>S.length || len<0 || len>S.length-pos-1)
		printf("ERROR");
	if(Sub->ch)  free(Sub->ch);
	if(!len){/*Sub->ch=NUL;*/ Sub->length=0;}
	else
	{for(i=0;i<=len-1;i++){Sub->ch[i]=S.ch[pos+i];}
	Sub->ch[len]='\0';
	Sub->length=len;
	}
}

/***************************检测完毕*******************************/
int Index(HString S,HString T,int pos)//返回主串S中第pos个字符之后的存在与T
{                                      //相等的第一个子串的 位置
	int i,n,m,j,flag,k=0;
	//HString *sub;
	//sub=(HString *)malloc(sizeof(HString));
	if(pos>0)
	{
		n=S.length;
		m=T.length;
		i=pos;
		while(S.ch[i]!='\0')
		{
			i++;k=i;
			for(j=0;j<m;j++)
			{
				//printf("#%c#",S.ch[i+j]);
				//printf("\t!%c!\t",T.ch[j+1]);
				if(S.ch[i+j]==T.ch[j+1]) flag=1;
				else flag=0;
			} 
			if(flag==0) continue;

			if(flag==1)break;
			//return i;


			// return i;
		}
	}
	return k;
}

/*******************检测完毕****************************/
void StrInsert(HString *S,int pos, HString T)
{//在串的的pos个字符之前插入串T

	int j,ns,ms,k,n;
	n=0;
	ns=S->length;
	ms=T.length;
	if(pos<1 || pos>S->length+1)
		printf("ERROR");
	if(T.length)
	{
		//if (!(S->ch=(char *)realloc(S->ch,(S->length+T.length+1) *sizeof(char)))
		//printf("ERROR");   
		/*for(i=S->length+1;i>pos+1;--i)
		{ S->ch[i+T.length]=S->ch[i];}
		for(i=0;i<T.length;i++)
		{S->ch[pos+i]=T.ch[i];}
		S->length+=T.length;*/
		k=ns+ms+1;
		for(j=ns+1;j>=pos;k--,j--)
		{S->ch[k]=S->ch[j];}
		for(k=1;k<=ms && T.ch[n]!='\0';k++)
		{S->ch[pos+k-1]=T.ch[k];
		++n;
		}
		S->length+=T.length;
	}
}

/********************检测完毕******************************/
void StrDelete(HString *S,HString T)
{//从串S中删除与T相同所有的字符串

	int ns,nt,i,flag,n;
	n=0;
	ns=S->length;
	nt=T.length;
	if(nt>ns || ns<0 || nt<0) printf("ERROR");
	//for(n=0;n<ns;n++)
	while(S->ch[n]!='\0')
	{
		n++;
		for(i=0;i<nt;i++)
			if(S->ch[n+i]==T.ch[i]) flag=1;
			else flag=0;


			if(flag==1)
			{
				for(i=0;i<ns;i++)
				{
					//printf("&%c&",S->ch[n+i+1]);
					S->ch[n+i+1]=S->ch[n+nt+i+1];
					//printf("#%c#",S->ch[n+i+1]);
				}//for
				printf("\t\t");
				ns=ns-nt;
				S->ch[ns+i]='\0';
				n=0;
				S->length=ns;
			}
			//else printf("你要删除的字符不存在!");
	}
}

/******************检测完毕**********************************/
void StrReplace(HString *S,HString T,HString V)
{//用V替换S中所有T的字符
	int ns,nt,nv,nc,i,flag,n,j=0;
	n=0;
	ns=S->length;
	nt=T.length;
	nv=V.length;
	nc=nt-nv;
	if(nt>ns || ns<0 || nt<0 || nv<0 || nv>ns) printf("ERROR");
	//for(n=0;n<ns;n++)
	while(S->ch[n]!='\0')
	{
		n++;
		for(i=0;i<nt;i++)
		{if(S->ch[n+i]==T.ch[i]) flag=1;
		else flag=0;}


		if(flag==1)
		{
			if(nt==nv)//完成
			{

				for(i=0;i<nv;i++)
				{printf("#%c#",S->ch[n+i+1]);
				S->ch[n+i+1]=V.ch[i+1];
				printf("\t\t!%c!\t\t",V.ch[i+1]);}
			}
			if(nv>nt)//abcdefghijk* de* abcd*  错误
			{
				for(i=ns-nc;i>n+nv;i--)
				{
					//printf("#%c#",S->ch[i]);
					S->ch[i]=S->ch[i+nc];//printf("\t!%c!\t",S->ch[i]);
				}

				//printf("\n/*************************/\n");
				for(j=0;j<nv;j++)
				{
					//printf("#%c#",S->ch[n+j+1]);
					S->ch[n+j+1]=V.ch[j+1];//printf("\t\t!%c!\t\t",S->ch[n+j+1]);
				}
				ns=ns+nv-nt;
				S->ch[ns-nc+1]='\0';
				S->length=ns;
			}
			if(nv<nt)//完成
			{
				while(V.ch[j+1]!='\0')
				{//printf("#%c#",S->ch[n+j+1]);
					S->ch[n+j+1]=V.ch[j+1];//printf("\t\t!%c!\t\t",S->ch[n+j+1]);
					j++;
				}
				printf("\n/*************************/\n");
				for(i=n+nt;i<=ns;i++)
				{
					//printf("#%c#",S->ch[i+1-nc]);
					S->ch[i+1-nc]=S->ch[i+1];//printf("\t\t!%c!\t\t",S->ch[i+1]);
				}
				S->length=S->length+nv-nt;
				S->ch[S->length+1]='\0';
				j=0;
			}
		}
		//else printf("你要找的字符不存在!");

	}
}

void StrCopy(HString *s,HString *h)
{
	int i;i=0;
	if(s->ch)  free(s);
	s=(HString *)malloc(sizeof(HString));
	while(h->ch[i]!='\0')
	{
		s->ch[i]=h->ch[i];i++;
	}
	s->ch[i]='\0';
	s->length=h->length;
}

/*********************检测完毕*****************************/
StrNode *LStrAssign()
{//链表创建
	StrNode *S,*p,*r;
	char c;
	int i=0;
	S=r=NULL;
	printf("\n\n\t\t请输入一个字符串,已*作为结束:");
	c=getchar();
	while(c!='*')
	{
		i++;
		p=(StrNode *)malloc(sizeof(StrNode));

		p->ch=c;
		if(S==NULL) S=p;
		else r->next=p;
		r=p;
		c=getchar();
	}
	if(r) r->next=NULL;
	S->length=i-1;
	return S;
}

/***********************检测完毕***************************/
void printStr(StrNode *S)
{
	StrNode *p;
	p=S;
	printf("\n输入的字符串是:");
	while(p->next!=NULL)
	{
		p=p->next;
		printf("%c",p->ch);

	}
	printf("\n字符串的长度是:%d\n",S->length);
}

void Strreplace(StrNode *S,StrNode T,StrNode V)
{//用V替换S中T的所有字符
	int ls,lt,lv,flag;//分别为S、T、V的长度
	StrNode *p,*q,*n,*p1,*p2,*q1;
	p=S;q=&T;n=&V;
	ls=S->length;
	lt=T.length;
	lv=V.length;
	while(p->next!=NULL)
	{
		p=p->next;
		p1=p;q1=q->next;
		while(q->next)
		{
			if(p1->next->ch==q1->ch) flag=1;
			else flag=0;
			p1=p1->next;q1=q1->next;
			p1=p1->next;
		}
		if(flag==1)
		{
			p->next=n;
			while(n->next){n=n->next;}
			n->next=p2;
		}
		S->length=S->length-T.length+V.length;
	}
}

测试程序main.cpp

#include<stdio.h>
#include<malloc.h>
#include <malloc.h>
#include "MyString.h"

void main()
{
	char choice,*cs;int l,a,b,c,d;
	HString *th,*ch,*sh,*xh,s,*sub;
	StrNode *ss,*ts,*vs;char chs;
	do
	{//cs=(char *)malloc(100*sizeof(char));
		printf("选择要进行的操作 \n");
		printf("======================================\n");
		printf("\t\t1.构建一个字符串\n");//完成
		printf("\t\t2.返回字符串的长度\n");//完成
		printf("\t\t3.两个字符串相比较\n");//完成
		printf("\t\t4.连接两个字符串\n");//完成
		printf("\t\t5.取出字符\n");//完成
		printf("\t\t6.从T字符串删除S字符串\n");//完成
		printf("\t\t7.从s中返回第i个与t相等的字符的位置\n");//完成
		printf("\t\t8.在串的的pos个字符之前插入串T\n");//完成
		printf("\t\t9.替换字符\n");
		printf("\t\ta.字符串初始化\n");//链式存储  完成
		printf("\t\tb.复制一个字符串\n");
		printf("\t\t0.退出\n");
		printf("======================================\n");

		printf("(0,1,2,3,4,5,6,7,8,9)");
		th=(HString *)malloc(sizeof(HString));
		sh=(HString *)malloc(sizeof(HString));
		ss=(StrNode *)malloc(sizeof(StrNode));
		choice=getchar();
		switch(choice)
		{case '1':StrCreat(th);StrOut(th);
		break;
		case '2':StrCreat(th);StrOut(th);
			l=StrLength(*th);
			printf("%d\n",l);
			break;
		case '3':StrCreat(th);StrOut(th);
			StrCreat(sh);StrOut(sh);
			l=StrCompare(*th,*sh);
			if(l!=111){printf("长度比较结果是%d\n",l);}
			else printf("两字符串完全相同!");
			break;
		case '4':xh=(HString *)malloc(sizeof(HString));
			ch=(HString *)malloc(sizeof(HString));
			StrCreat(xh);StrOut(xh);
			StrCreat(ch);StrOut(ch);
			concat(sh,*xh,*ch);
			StrOut(sh);
			break;
		case '5':StrCreat(&s);StrOut(&s);
			sub=(HString *)malloc(sizeof(HString));
			printf("取出的位置与长度:");
			scanf("%d%d",&a,&b);
			SubStr(sub,s,a,b);
			StrOut(sub);
			break;
		case '6':StrCreat(th);StrOut(th);
			StrCreat(sh);StrOut(sh);
			StrDelete(th,*sh);
			StrOut(th);
			break;
		case '7':printf("主串:\n");
			StrCreat(th);StrOut(th);
			printf("要找的字符:\n");
			StrCreat(sh);StrOut(sh);
			printf("第i个,i=\n");scanf("%d",&c);
			l=Index(*th,*sh,c);
			printf("你找的字符所在位置为%d\n",l);
			break;
		case '8':StrCreat(th);StrOut(th);
			printf("插入的字符串:");
			StrCreat(sh);StrOut(sh);
			printf("插入位置");scanf("%d",&d);
			StrInsert(th,d,*sh);
			StrOut(th);
			break;
		case 'a':
			ss=LStrAssign();
			printStr(ss);
			break;
		case '9':/*ss=LStrAssign();
				 printStr(ss);
				 printf("要替换的字符:"); ts=LStrAssign();
				 printf("替换成:");vs=LStrAssign();
				 StrReplace(ss,*ts,*vs);
				 printf("替换后的字符串是:"); printStr(ss);*/
			StrCreat(th);StrOut(th);
			printf("要替换的字符:");StrCreat(sh);
			ch=(HString *)malloc(sizeof(HString));
			printf("替换成:");StrCreat(ch);
			StrReplace(th,*sh,*ch);
			printf("替换后的字符串是:");StrOut(th);
			break;
		case 'b':
			StrCreat(th);StrOut(th);
			StrCopy(sh,th);
			StrOut(sh);
			break;
		case '0':return;
		}
		printf("\n\n\t\t==按任意键返回主菜单==\n\t\t");
		fflush(stdin);
		scanf("%c",&chs);
	}while(choice!='0');
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值