字符串操作-串的存储结构、赋值、串长、子串、匹配...

   这是放假之前写的很乱的代码,主要解决字符串操作的问题,如串赋值、求串长、求子串等等
//#include "file.h"
//#include "function.c"
#include <cstdio>
#include <malloc.h>
#include <math.h>
#include <string.h>
#include <cstdlib>
#include <iostream>
//#include "c1-1.h"
using namespace std;
typedef struct HString
{
	char *ch;
	int length;
}HString;

int StrAssign(HString *T,char *chars)
{
	int i,j;
	if(T->ch)
		free(T->ch);
	i=strlen(chars);
	if(!i)
	{
		T->ch=NULL;
		T->length=0;

	}
	else
        T->ch=(char*)malloc(i*sizeof(char));
	    if(!T->ch)//分配空间失败
			exit(OVERFLOW);
		for(j=0;j<i;j++)
			T->ch[j]=chars[j];
		T->length=i;

    return 1;
}

int Length(HString T)
{
	
	return T.length;
}





void InitString(HString *T)
{
	T->length=0;
	T->ch=NULL;
}
void StrPrint(HString T)//所有的操作后的字符放到了T.ch中
{
	int i;
		for(i=0;i<T.length;i++)
			printf("%c",T.ch[i]);
	printf("\n");
}
int StrCopy(HString *T,HString t)
{
	int i;
	if(T->ch)
			free(T->ch);
	T->ch=(char*)malloc((t.length)*sizeof(char));
	if(!T->ch)
		exit(OVERFLOW);
	for(i=0;i<t.length;i++)
		T->ch[i]=t.ch[i];
	T->length=t.length;
	return 1;

}
void StrCat(HString *s,HString t,HString r)
{
	int i;
	if(s->ch)
		free(s->ch);
	s->length=t.length+r.length;
	s->ch=(char *)malloc(s->length*sizeof(char));
	if(!s->ch)
		exit(OVERFLOW);
	for(i=0;i<t.length;i++)
		s->ch[i]=t.ch[i];
	for(i=0;i<r.length;i++)
		s->ch[t.length+i]=r.ch[i];

}
int SubString(HString *Sub,HString t,int pos,int len)
{//sub返回串s中第pos  个字符起长度为len的字符串;
	int i;
	if(pos<1||pos>t.length||len<0||len>t.length-pos+1)
     	exit(OVERFLOW);
	if(Sub->ch)
		free(Sub->ch);
	if(!len)
	{
		Sub->ch=NULL;
		Sub->length=0;
	}
	else
	{
		Sub->ch=(char *)malloc(len*sizeof(char));
		//if(!Sub->ch)
			//exit(OVERFLOW);
		for(i=0;i<=len-1;i++)
		{
			Sub->ch[i]=t.ch[pos-1+i];
		}
			Sub->length=len;

		
	}

	return 0;

}
int StrComp(HString t,HString r)
{//串比较
	if(t.length>r.length)
		return 1;
	else
		return 0;

}
int StrCompare(HString s,HString t)
{//比较两串是否相等,返回两串的差值
	int i;
	for(i=0;i<s.length&&i<t.length;++i)
		if(s.ch[i]!=t.ch[i])
			return s.ch[i]-t.ch[i];
	return s.length-t.length;
}
int StrIndex(HString s,HString t,int pos)
{//求串的定位,若t是母串s的子串,返回t在s首次出现的位置,否则返回0
	int n,m,i;
	HString sub;
	InitString(&sub);
	if(pos>0)
	{//其实更应该注意参数的合法性,这样才能保证程序的健壮性
		n=Length(s);
		m=Length(t);
		i=pos;
		while(i<=n-m+1)//note:下标的取值范围为什么我自己不能想出来
		{//从母串的第i个位置取得长度为m的字串
			SubString(&sub,s,i,m);
			if(StrCompare(sub,t)!=0)//将模式串与子串一一比较
				++i;//why is not i++?
			else
				return i;
		}
	}
	return 0;
}
int   StrInsert(HString *s,int pos,HString t)
{//插入串为t,原串为s,t在s的第pos 位置之前插入
	//程序执行起来有点毛病
	int i;
		if(pos<1||pos>s->length+1)
			printf("pos 位置不合法!!!:");
	if(t.length)
	{

		s->ch=(char*)realloc(s->ch,(s->length+t.length)*sizeof(char));
		if(!s->ch)
			exit(OVERFLOW);

		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-1+i]=t.ch[i];
	s->length=t.length;
	}
	return 0;


}
int StrEmpty(HString s)
{

	if(s.length==0)
		printf("此串为空串");
	else
		printf("此串不为空串!");
}

void StrDelete(HString *s,int pos,int len)
{

	int i;
	if(s->length<pos+len-1)
	{
		printf("参数出错");
		exit(OVERFLOW);
	}
	for(i=pos-1;i<s->length;i++)
		s->ch[i]=s->ch[i+len];
	s->length-=len;
	s->ch=(char*)realloc(s->ch,s->length*sizeof(char));
	


}
	
int StrReplace(HString *s,HString t,HString v)
{//从第几个位置替换:用V替换主串S中出现的所有与T相等的不重叠的子串
	int i=1;// 从串S的第一个字符起查找串T
	if(StrEmpty(t))
			printf("出错了,");
	do
	{
		i=StrIndex(*s,t,i);//结果为从上一个I之后找到子串T的位置
		if(i)//串S存在串T
		{
			StrDelete(s,i,Length(t));//删除该串T
			StrInsert(s,i,v);//在原串T的位置插入串V
			i+=Length(v);
		}

	}while(i);
	return i;
	


}
int StrClear(HString *s)
{
	int i=0;
	/*while(s->ch[i])
	{
		free(s->ch[i]);
		i++;
	}
	s->length=0;*/
	//这是我一开始写的的代码,不能放弃任何学习的机会
	while(s->ch)
	{
		free(s->ch);
		s->ch=NULL;// 这个很容易忘记
	}
	s->length=0;
	return 1;
}
void StrDestory()
{

}
int menu_select()
{  
	char c;
	int n;

printf("\n\n");	
printf("                     实现字符串操作的的部分功能!     \n");
printf("                                                    ");
printf("\n        **********  于波&&学号2012070152   ***\n\n");

printf("         *卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍*  \n"); 
printf("         ㊣                                         ㊣   \n"); 
printf("         ㊣                  菜    单               ㊣   \n"); 
printf("         ㊣                                         ㊣   \n"); 
printf("         ㊣                                         ㊣ \n"); 
printf("         ㊣                 (1)--- 初始化           ㊣  \n"); 
printf("         ㊣                 (2)--- 串赋值           ㊣  \n"); 
printf("         ㊣                 (3)--- 求串长           ㊣  \n"); 
printf("         ㊣                 (4)--- 求子串           ㊣  \n"); 
printf("         ㊣                 (5)--- 串连接           ㊣  \n"); 
printf("         ㊣                 (6)--- 串删除           ㊣  \n"); 
printf("         ㊣                 (7)--- 串比较           ㊣  \n"); 
printf("         ㊣                 (*0*)-退出系统          ㊣  \n");
printf("         ㊣                 (*9*)-显示菜单          ㊣  \n");
printf("         ㊣            注意:目前仅支持字母,其他...*\n");
	               
printf("         *========= 请在上述序号中选择一个并输入:==* ");


}  
int  main()
{
	int i,m,n;
	int flags=1;
	char c,p[200];
	HString t,s,r,Sub,k,a;
	system("cls");
	

	InitString(&r);
	InitString(&a);
	
	do{ 
		if(flags==1)
	      menu_select();
		scanf("%d",&i);
		
		switch(i){
		    //HString类型必须初始化
	
  		case 1:{ 
				   InitString(&t);
			
				  flags=0;
				  printf("初始化完成,请继续选择:\n");
				   break;
				  


			   }
		case 2:{
				   	   printf("请输入一串字符串,少于200字\n");
					   cin.get();//消除换行符带来的影响
					   cin.getline(p,200);
				   StrAssign(&t,p);//现在t有内容
	                printf("串t为:");
	                StrPrint(t);
					printf("串赋值完成,请继续选择:\n");	
					flags=0;
				
				// system("pause");
			
					break;
			   }
		case 3:{
				   i=Length(t);
              	printf("串t长为%d\n",i);
				 //system("pause");
				 printf("求串长已完成,请继续选择\n");
				break;
				
 			   }
		case 4:{
			    printf("请输入t的第i个字符,长度为len的,注意参数范围:\n");
				printf("1<=i<=串长,0<=len-i+1\n");
				scanf("%d%d",&m,&n);				
             	printf(" t的子串sub为");
				SubString(&Sub,t,m,n);//假设从t字符串的第5个位置起长度为5的S                                      //ubString
		        StrPrint(Sub);
				printf("求子串已完成,请继续");
				flags=0;
				 //system("pause");
				break;
			   }
        case 5:{
				   printf("请输入一个字符串,少于200字\n");

				   	InitString(&s);
					 cin.get();//消除换行符带来的影响
					   cin.getline(p,200);
				   StrAssign(&s,p);//现在t有内容
				    printf("串t为:");
	                StrPrint(t);
				  StrCat(&t,t,s);
				  
				  	printf("连接后的串为:");
                	StrPrint(t);
					printf("求子串已完成,请继续");
					flags=0;

					//system("pause");

			   }
		case 6:{   printf("请输入删除串的位置和长度\n");
				   printf("%d %d",m,n);
				   StrDelete(&t,m,n);
	
				   
				   StrPrint(t);
				   flags=0;
				   break;
				   
			   }
		case 9:{ 
				   flags=1;

			   }





//	printf("%d\ns的长度为",i);
//	i=Length(s);
//	printf("%d\n下面是比较s和t:",i);
  /*  i=StrCompare(s,r);
	printf("%d\n",i);
	printf("%d是串r从第一个字符起,和串s相同的第一\n",StrIndex(s,r,1));
    printf("串r插入到串t中从四个位置,总长度为r 的大小:\n");   
   // StrPrint(t);
	//StrPrint(r);
	StrInsert(&t,4,r);
	StrPrint(t);
	InitString(&k);
	
	printf("串k是否空");
	StrEmpty(k);
	StrAssign(&k,e);
	printf("字符串e删除从第3个位置开始,长度为3,剩下的字符串为:\n");
	
	StrReplace(&s,r,t);
	StrPrint(s);
	StrClear(&s);
	printf("字符串s为");
	StrPrint(s);*/
		}
	}while(i!=0);
	return 0;
}



字符串操作-串的存储结构、赋值、串长、子串、匹配...

上一篇:在不知道算法原理的情况下,如何阅读理解算法的matlab程序


下一篇:0006 找出1-999之间能被3整除且至少有一位为5的的所有整数