int main()
{
	SString s;
	StrAssign(s,"acabaabaabcacaabc");
	SString t;
	StrAssign(t,"abaabcac");
	StrPrint(s);
	StrPrint(t);

	int next[10];
	get_next(t,next);
	
	SString v;
	StrAssign(v,"xy");
	if(Replace(s,t,v)) StrPrint(s);
	if(Reverse(v)) StrPrint(v);
	
	int cnt[10];
	if(Count(s,v,cnt)){
		StrPrint(v);
		for(int i=0; i<=v[0]; i++)
			printf("%d ",cnt[i]);
	}

	return 0;
}
Status Replace(SString& S, SString T, SString V){
//入口断言:S,T,V存在
//操作结果:将S中出现的所有不重复的T都替换为V
	int k = Index(S, T, 1);
	if(k){
		SString suffix;	StrAssign(suffix,"");
		int n = T[0], m = S[0];
		while(k){
			printf("%d\n",k);
			SString temp;	
			SubString(temp, S, 1, k-1); //当前第一个T的前缀
			StrPrint(temp);
			if(Concat(suffix, temp)){
				StrPrint(suffix);
				Concat(suffix, V); //追加上V
				StrPrint(suffix);
				m -= (k-1)+n; //处理掉上一组后剩余的后缀长度
				SubString(temp, S, k+n, m);
				StrCopy(S, temp); //S被截断为尚未处理的后缀
				k = Index(S, T, 1);
			}else return OVERFLOW; //S空间不足
		}
		if(Concat(suffix, S)){
			StrCopy(S, suffix);
			return OK;
		}else return OVERFLOW;
	}
	else return OK; //T未出现过
}
int main()
{
	StrPtr s, t, v;
	StrAssign(s, "aaaabb");
	StrPrint(s);
	StrAssign(t, "ccdd");
	if(Concat(v,s,t)) StrPrint(v);
	if(SubString(v,s,2,4)) StrPrint(v);
	return 0;
}
void main()
{
	int i;
	char c, *p = "God bye!", *q = "God luck!";
	HString t, s, r;

	InitString(t);
	InitString(s);
	InitString(r);
	StrAssign(t, p);
	printf("串t为");
	StrPrint(t);
	printf("串长为%d,串空否?%d(1:空 0:否)\n", StrLength(t), StrEmpty(t));
	StrAssign(s, q);
	printf("串s为");
	StrPrint(s);
	i = StrCompare(s, t);
	if (i < 0)
		c = '<';
	else if (i == 0)
		c = '=';
	else
		c = '>';
	printf("串s%c串t\n", c);
	Concat(r, t, s);
	printf("串t连接串s产生的串r为");
	StrPrint(r);
	StrAssign(s, "oo");
	printf("串s为");
	StrPrint(s);
	StrAssign(t, "o");
	printf("串t为");
	StrPrint(t);
	Replace(r, t, s);
	printf("把串r中和串t相同的子串用串s代替后,串r为");
	StrPrint(r);
	ClearString(s);
	printf("串s清空后,串长为%d,空否?%d(1:空 0:否)\n", StrLength(s), StrEmpty(s));
	SubString(s, r, 6, 4);
	printf("串s为从串r的第6个字符起的4个字符,长度为%d,串s为", s.length);
	StrPrint(s);
	StrCopy(t, r);
	printf("由串r复制得串t,串t为");
	StrPrint(t);
	StrInsert(t, 6, s);
	printf("在串t的第6个字符前插入串s后,串t为");
	StrPrint(t);
	StrDelete(t, 1, 5);
	printf("从串t的第1个字符起删除5个字符后,串t为");
	StrPrint(t);
	printf("%d是从串t的第1个字符起,和串s相同的第1个子串的位置\n", Index(t, s, 1));
	printf("%d是从串t的第2个字符起,和串s相同的第1个子串的位置\n", Index(t, s, 2));
	DestroyString(t);
}
Beispiel #5
0
void test()
{
	char ch[2][255];
	int i=0,pos=1;
	SString S[2],T;

	for(i=0;i<2;i++)
	{
		printf("ÊäÈë×Ö·û´®%d:",i+1);
		scanf("%s",ch[i]);
		StrAssign(S[i],ch[i]);
	}

	for(i=0;i<2;i++)
	{
		printf("Êä³ö×Ö·û´®%d:",i+1);
		StrPrint(S[i]);
		printf("×Ö·ûÊÇ·ñΪ¿Õ%d(1-·Ç 0-¿Õ),×Ö·û´®³¤¶È:%d\n",!StrEmpty(S[i]),StrLength(S[i]));
	}

	printf("---Á¬½Ó´®--\n");
	Concat(T,S[0],S[1]);
	printf("Á¬½Óºó:");
	StrPrint(T);
	
	printf("---Çó×Ó´®---\n");
	printf("ÊäÈë×Ö´®:");
	scanf("%s",ch[0]);
	printf("ÊäÈë²éÕÒλÖÃ:");
	scanf("%d",&pos);
	StrAssign(S[0],ch[0]);
	i=Index(T,S[0],pos);
	printf("²éÕÒµ½µÄλÖÃ:%d\n",i);

	printf("---Ìæ´ú---\n");
	printf("ÊäÈëÌæ´úµÄ×Ó´®:");
	scanf("%s",ch[1]);
	printf("Ìæ»»%sºó:",ch[0]);
	StrAssign(S[1],ch[1]);
	Replace(T,S[0],S[1]);
	StrPrint(T);

	printf("±È½Ï×Ö·û´®:S%d%cS%d\n",1,StrCompare(S[0],S[1])>0?'>':StrCompare(S[0],S[1])<0?'<':'=',2);
	StrCopy(S[0],S[1]);
	printf("---¸´Öƺó---\n");
	for(i=0;i<2;i++)
	{
		printf("Êä³ö×Ö·û´®%d:",i+1);
		StrPrint(S[i]);
		printf("×Ö·ûÊÇ·ñΪ¿Õ%d(1-·Ç 0-¿Õ),×Ö·û´®³¤¶È:%d\n",!StrEmpty(S[i]),StrLength(S[i]));
	}
	printf("±È½Ï×Ö·û´®:S%d%cS%d\n",1,StrCompare(S[0],S[1])>0?'>':StrCompare(S[0],S[1])<0?'<':'=',2);
}
Beispiel #6
0
void main()
{
  int i;
  char c,*p="God bye!",*q="God luck!";
  HString t,s,r;
  InitString(&t); /* HString类型必需初始化 */
  InitString(&s);
  InitString(&r);
  StrAssign(&t,p);
  printf("串t为: ");
  StrPrint(t);
  printf("串长为%d 串空否?%d(1:空 0:否)\n",StrLength(t),StrEmpty(t));
  StrAssign(&s,q);
  printf("串s为: ");
  StrPrint(s);
  i=StrCompare(s,t);
  if(i<0)
    c='<';
  else if(i==0)
    c='=';
  else
    c='>';
  printf("串s%c串t\n",c);
  Concat(&r,t,s);
  printf("串t联接串s产生的串r为: ");
  StrPrint(r);
  StrAssign(&s,"oo");
  printf("串s为: ");
  StrPrint(s);
  StrAssign(&t,"o");
  printf("串t为: ");
  StrPrint(t);
  Replace(&r,t,s);
  printf("把串r中和串t相同的子串用串s代替后,串r为:\n");
  StrPrint(r);
  ClearString(&s);
  printf("串s清空后,串长为%d 空否?%d(1:空 0:否)\n",StrLength(s),StrEmpty(s));
  SubString(&s,r,6,4);
  printf("串s为从串r的第6个字符起的4个字符,长度为%d 串s为: ",s.length);
  StrPrint(s);
  StrCopy(&t,r);
  printf("复制串t为串r,串t为: ");
  StrPrint(t);
  StrInsert(&t,6,s);
  printf("在串t的第6个字符前插入串s后,串t为: ");
  StrPrint(t);
  StrDelete(&t,1,5);
  printf("从串t的第1个字符起删除5个字符后,串t为: ");
  StrPrint(t);
  printf("%d是从串t的第1个字符起,和串s相同的第1个子串的位置\n",Index(t,s,1));
  printf("%d是从串t的第2个字符起,和串s相同的第1个子串的位置\n",Index(t,s,2));
}
 void Search()
 { // 查找字符串
   int i,k,f=1; // f为继续查找标志
   char b[2];
   HString s;
   printf("请输入待查找的字符串: ");
   scanf("%s%*c",str);
   InitString(s);
   StrAssign(s,str);
   for(i=0;i<n&&f;i++) // 逐行查找
   {
     k=1; // 由每行第1个字符起查找
     while(k)
     {
       k=Index(T[i],s,k); // 由本行的第k个字符开始查找
       if(k) // 找到
       {
         printf("第%d行: ",i+1);
         StrPrint(T[i]);
         printf("第%d个字符处找到。继续查找吗(Y/N)? ",k);
         gets(b);
         if(b[0]!='Y'&&b[0]!='y') // 中断查找
         {
           f=0;
           break;
         }
         else
           k++;
       }
     }
   }
   if(f)
     printf("没找到\n");
 }
Beispiel #8
0
int main()
{
    char cmd[MAXCMD]={0};     // Commande
    int ret;                  // Le retour de la fonctions
    String S[MAXLEN]={0},*p;  //S:String  p:Pointeur à String
    char tmp[MAXLEN]={0};
 
    printf("***********************************************\n");
    printf("------ Première implementaion du String ------\n");
    printf("La maxime longeur du string: %d\n",MAXLEN);
    printf("Options de commandes: \n");
    printf("0: StrAssign \n");
    printf("1: StrLength \n");
    printf("2: StrPrint \n");
    printf("#: Quit \n");
    printf("***********************************************\n");
 
    while (1)
    {
        scanf("%s",cmd);// Lire la commande
 
        if (cmd[0]=='#') break; // Quiter
       
                  
        if (!CharsCompare(cmd,"0\0"))
        {
            scanf("%s",tmp);    // La valeur initial
            p=&S[0];
            ret=StrAssign(p,tmp);
        }
       
        else if (!CharsCompare(cmd,"1\0"))
        {
            p=&S[0];
            ret=StrLength(*p);
           
            printf("length is %d.\n",ret);
            ret=OK;
        }
       
        else if (!CharsCompare(cmd,"2\0"))
        {
            p=&S[0];
            ret=StrPrint(*p);
        }
        else
        {
            printf("The Command is Error.\n");
        }
 
        if (ret==OK) 
            printf("This Command is Successful.\n\n");
        else if (ret==ERROR) 
            printf("The input data is Error.\n\n");
        else if (ret==OVERFLOW) 
            printf("OVERFLOW.\n\n");
    }
 
    return 0;
}
 void List()
 { // 显示文本内容
   int i;
   for(i=0;i<n;i++)
   {
     printf("%d: ",i+1);
     StrPrint(T[i]);
   }
 }
Beispiel #10
0
 void ALGO4_1_main()
 {
   int i,j,*p;
   SString s1,s2; // 以教科书中图4.5为例
   StrAssign(s1,"acabaabaabcacaabc");
   printf("主串为: ");
   StrPrint(s1);
   StrAssign(s2,"abaabcac");
   printf("子串为: ");
   StrPrint(s2);
   i=StrLength(s2);
   p=(int*)malloc((i+1)*sizeof(int)); // 生成s2的next数组
   get_next(s2,p);
   printf("子串的next函数为: ");
   for(j=1;j<=i;j++)
     printf("%d ",*(p+j));
   printf("\n");
   i=Index_KMP(s1,s2,1,p);
   if(i)
     printf("主串和子串在第%d个字符处首次匹配\n",i);
   else
     printf("主串和子串匹配不成功\n");
 }
Beispiel #11
0
 void Modify()
 { // 修改行
   int i;
   printf("请输入待修改的行号: ");
   scanf("%d%*c",&i);
   if(i>0&&i<=n) // 行号合法
   {
     printf("%d: ",i);
     StrPrint(T[i-1]);
     printf("请输入新内容: ");
     gets(str);
     StrAssign(T[i-1],str);
   }
   else
     printf("行号超出范围\n");
 }
Beispiel #12
0
 void Replace()
 { // 替换字符串
   int i,k,f=1; // f为继续替换标志
   char b[2];
   HString s,t;
   printf("请输入待替换的字符串: ");
   scanf("%s%*c",str);
   InitString(s);
   StrAssign(s,str);
   printf("替换为: ");
   scanf("%s%*c",str);
   InitString(t);
   StrAssign(t,str);
   for(i=0;i<n&&f;i++) // 逐行查找、替换
   {
     k=1; // 由每行第1个字符起查找
     while(k)
     {
       k=Index(T[i],s,k); // 由本行的第k个字符开始查找
       if(k) // 找到
       {
         printf("第%d行: ",i+1);
         StrPrint(T[i]);
         printf("第%d个字符处找到。是否替换(Y/N)? ",k);
         gets(b);
         if(b[0]=='Y'||b[0]=='y')
         {
           StrDelete(T[i],k,StrLength(s));
           StrInsert(T[i],k,t);
         }
         printf("继续替换吗(Y/N)?");
         gets(b);
         if(b[0]!='Y'&&b[0]!='y') // 中断查找、替换
         {
           f=0;
           break;
         }
         else
           k+=StrLength(t);
       }
     }
   }
   if(f)
     printf("没找到\n");
 }
int main()
{

    int i,j;
    Status k;
    char s;
    String t,s1,s2;
    printf("请输入串s1: ");

    k=StrAssign(s1,"abcd");
    if(!k)
    {
        printf("串长超过MAXSIZE(=%d)\n",MAXSIZE);
        exit(0);
    }
    printf("串长为%d 串空否?%d(1:是 0:否)\n",StrLength(s1),StrEmpty(s1));
    StrCopy(s2,s1);
    printf("拷贝s1生成的串为: ");
    StrPrint(s2);
    printf("请输入串s2: ");

    k=StrAssign(s2,"efghijk");
    if(!k)
    {
        printf("串长超过MAXSIZE(%d)\n",MAXSIZE);
        exit(0);
    }
    i=StrCompare(s1,s2);
    if(i<0)
        s='<';
    else if(i==0)
        s='=';
    else
        s='>';
    printf("串s1%c串s2\n",s);
    k=Concat(t,s1,s2);
    printf("串s1联接串s2得到的串t为: ");
    StrPrint(t);
    if(k==FALSE)
        printf("串t有截断\n");
    ClearString(s1);
    printf("清为空串后,串s1为: ");
    StrPrint(s1);
    printf("串长为%d 串空否?%d(1:是 0:否)\n",StrLength(s1),StrEmpty(s1));
    printf("求串t的子串,请输入子串的起始位置,子串长度: ");

    i=2;
    j=3;
    printf("%d,%d \n",i,j);

    k=SubString(s2,t,i,j);
    if(k)
    {
        printf("子串s2为: ");
        StrPrint(s2);
    }
    printf("从串t的第pos个字符起,删除len个字符,请输入pos,len: ");

    i=4;
    j=2;
    printf("%d,%d \n",i,j);


    StrDelete(t,i,j);
    printf("删除后的串t为: ");
    StrPrint(t);
    i=StrLength(s2)/2;
    StrInsert(s2,i,t);
    printf("在串s2的第%d个字符之前插入串t后,串s2为:\n",i);
    StrPrint(s2);
    i=Index(s2,t,1);
    printf("s2的第%d个字母起和t第一次匹配\n",i);
    SubString(t,s2,1,1);
    printf("串t为:");
    StrPrint(t);
    Concat(s1,t,t);
    printf("串s1为:");
    StrPrint(s1);
    Replace(s2,t,s1);
    printf("用串s1取代串s2中和串t相同的不重叠的串后,串s2为: ");
    StrPrint(s2);


    return 0;
}
Beispiel #14
0
int main()
{
    int i, j, opp, pos;
    char s, str;
	String t,s1,s2,sub;
	Status k;

    printf("\n1.StrAssign 生成串 \n2.StrLength 求串长 \n3.StrCompare 串比较 ");
    printf("\n4.Concat 串连接 \n5.SubString 求子串 \n6.Index 求子串位置");
    printf("\n7.StrInsert 子串插入 \n8.StrDelete 子串删除 \n9.Replace 子串替换");
    printf("\n0.退出 \n请选择你的操作:\n");
    while(opp != '0')
    {
        scanf("%d",&opp);
        switch(opp)
        {
        case 1:
            k=StrAssign(s1,"nowamagic.net");
            if(!k)
            {
                printf("串长超过MAXSIZE(=%d)\n",MAXSIZE);
                exit(0);
            }
            printf("串s1为:");
            StrPrint(s1);
            printf("\n");
            break;

        case 2:
            printf("串s1长为%d \n",StrLength(s1));
            break;

        case 3:
            k=StrAssign(s2,"google.com");
            if(!k)
            {
                printf("串长超过MAXSIZE(%d)\n",MAXSIZE);
                exit(0);
            }
            printf("串s2为:");
            StrPrint(s2);
            printf("\n");

            i=StrCompare(s1,s2);
            if(i < 0)
                s=' < ';
            else if(i==0)
                s='=';
            else
                s='>';
            printf("串s1%c串s2\n",s);
            break;

        case 4:
            Concat(t,s1,s2);
            StrPrint(t);
            break;

        case 5:
            printf("求串s1的子串,请输入子串的起始位置: ");
            scanf("%d", &i);
            printf("请输入子串的长度: ");
            scanf("%d", &j);
            printf("起始位置:%d,子串长度:%d\n", i, j);
            k=SubString(sub,s1,i,j);
            if(k)
            {
                printf("子串sub为: ");
                StrPrint(sub);
            }
            break;

        case 6:
            printf("主串s1为: ");
            StrPrint(s1);
            k=StrAssign(sub,"magic");
            printf("子串sub为: ");
            StrPrint(sub);
            i=Index(s1,sub,1);
            printf("s1的第%d个字母起和sub第一次匹配\n",i);
            break;

        case 7:
            printf("主串s1为: ");
            StrPrint(s1);
            k=StrAssign(sub,"lol");
            printf("子串sub为: ");
            StrPrint(sub);
            printf("请输入要插入的位置: ");
            scanf("%d", &pos);
            StrInsert(s1,pos,sub);
            StrPrint(s1);
            break;

        case 8:
            printf("从串s1的第pos个字符起,删除len个字符,请输入pos: \n");
            scanf("%d", &i);
            printf("再输入len: \n");
            scanf("%d", &j);
            StrDelete(s1,i,j);
            StrPrint(s1);
            break;

        case 9:
            printf("主串s1为: ");
            StrPrint(s1);
            StrAssign(t,"a");
            printf("串t为:");
            StrPrint(t);
            StrAssign(sub,"aa");
            printf("串sub为:");
            StrPrint(sub);
            printf("用串s2取代串s1中和串t相同的不重叠的串后,串s1为: ");
            Replace(s1,t,sub);
            StrPrint(s1);
            break;

        case 0:
            exit(0);
        }
    }
}
Beispiel #15
0
int main()
{
	int i, *p;
	String s1, s2;

	StrAssign(s1, "ababaaaba");
	StrAssign(s2, "ababaaaba");
	Index_KMP(s1, s2, 0);

	StrAssign(s1, "abcdex");
	printf("子串为: ");
	StrPrint(s1);
	i = StrLength(s1);
	p = (int*)malloc((i + 1)*sizeof(int));
	get_next(s1, p);
	printf("Next为: ");
	NextPrint(p, StrLength(s1));
	printf("\n");

	StrAssign(s1, "abcabx");
	printf("子串为: ");
	StrPrint(s1);
	i = StrLength(s1);
	p = (int*)malloc((i + 1)*sizeof(int));
	get_next(s1, p);
	printf("Next为: ");
	NextPrint(p, StrLength(s1));
	printf("\n");

	StrAssign(s1, "ababaaaba");
	printf("子串为: ");
	StrPrint(s1);
	i = StrLength(s1);
	p = (int*)malloc((i + 1)*sizeof(int));
	get_next(s1, p);
	printf("Next为: ");
	NextPrint(p, StrLength(s1));
	printf("\n");

	StrAssign(s1, "aaaaaaaab");
	printf("子串为: ");
	StrPrint(s1);
	i = StrLength(s1);
	p = (int*)malloc((i + 1)*sizeof(int));
	get_next(s1, p);
	printf("Next为: ");
	NextPrint(p, StrLength(s1));
	printf("\n");

	StrAssign(s1, "ababaaaba");
	printf("   子串为: ");
	StrPrint(s1);
	i = StrLength(s1);
	p = (int*)malloc((i + 1)*sizeof(int));
	get_next(s1, p);
	printf("   Next为: ");
	NextPrint(p, StrLength(s1));
	get_nextval(s1, p);
	printf("NextVal为: ");
	NextPrint(p, StrLength(s1));
	printf("\n");

	StrAssign(s1, "aaaaaaaab");
	printf("   子串为: ");
	StrPrint(s1);
	i = StrLength(s1);
	p = (int*)malloc((i + 1)*sizeof(int));
	get_next(s1, p);
	printf("   Next为: ");
	NextPrint(p, StrLength(s1));
	get_nextval(s1, p);
	printf("NextVal为: ");
	NextPrint(p, StrLength(s1));

	printf("\n");

	StrAssign(s1, "00000000000000000000000000000000000000000000000001");
	printf("主串为: ");
	StrPrint(s1);
	StrAssign(s2, "0000000001");
	printf("子串为: ");
	StrPrint(s2);
	printf("\n");
	printf("主串和子串在第%d个字符处首次匹配(朴素模式匹配算法)\n", Index(s1, s2, 1));
	printf("主串和子串在第%d个字符处首次匹配(KMP算法) \n", Index_KMP(s1, s2, 1));
	printf("主串和子串在第%d个字符处首次匹配(KMP改良算法) \n", Index_KMP1(s1, s2, 1));

	return 0;
}
Beispiel #16
0
 void main()
 {
   char *s1="ABCDEFGHI",*s2="12345",*s3="",*s4="asd#tr",*s5="ABCD";
   Status k;
   int pos,len;
   LString t1,t2,t3,t4;
   InitString(&t1);
   InitString(&t2);
   printf("初始化串t1后,串t1空否?%d(1:空 0:否) 串长=%d\n",StrEmpty(t1),StrLength(t1));
   k=StrAssign(&t1,s3);
   if(k==OK)
   {
     printf("串t1为: ");
     StrPrint(t1);
   }
   else
     printf("出错\n"); /* 不能生成空串 */
   k=StrAssign(&t1,s4);
   if(k==OK)
   {
     printf("串t1为: ");
     StrPrint(t1);
   }
   else
     printf("出错\n"); /* 不能生成含有变量blank所代表的字符的串 */
   k=StrAssign(&t1,s1);
   if(k==OK)
   {
     printf("串t1为: ");
     StrPrint(t1);
   }
   else
     printf("出错\n");
   printf("串t1空否?%d(1:空 0:否) 串长=%d\n",StrEmpty(t1),StrLength(t1));
   StrAssign(&t2,s2);
   printf("串t2为: ");
   StrPrint(t2);
   StrCopy(&t3,t1);
   printf("由串t1拷贝得到串t3,串t3为: ");
   StrPrint(t3);
   InitString(&t4);
   StrAssign(&t4,s5);
   printf("串t4为: ");
   StrPrint(t4);
   Replace(&t3,t4,t2);
   printf("用t2取代串t3中的t4串后,串t3为: ");
   StrPrint(t3);
   ClearString(&t1);
   printf("清空串t1后,串t1空否?%d(1:空 0:否) 串长=%d\n",StrEmpty(t1),StrLength(t1));
   Concat(&t1,t2,t3);
   printf("串t1(=t2+t3)为: ");
   StrPrint(t1);
   Zip(&t1);
   printf("去除不必要的占位符后,串t1为: ");
   StrPrint(t1);
   pos=Index(t1,t3,1);
   printf("pos=%d\n",pos);
   printf("在串t1的第pos个字符之前插入串t2,请输入pos: ");
   scanf("%d",&pos);
   k=StrInsert(&t1,pos,t2);
   if(k)
   {
     printf("插入串t2后,串t1为: ");
     StrPrint(t1);
   }
   else
     printf("插入失败!\n");
   printf("求从t1的第pos个字符起,长度为len的子串t2,请输入pos,len: ");
   scanf("%d,%d",&pos,&len);
   SubString(&t2,t1,pos,len);
   printf("串t2为: ");
   StrPrint(t2);
   printf("StrCompare(t1,t2)=%d\n",StrCompare(t1,t2));
   printf("删除串t1中的子字符串:从第pos个字符起删除len个字符。请输入pos,len:");
   scanf("%d,%d",&pos,&len);
   k=StrDelete(&t1,pos,len);
   if(k)
   {
     printf("从第%d位置起删除%d个元素后串t1为:",pos,len);
     StrPrint(t1);
   }
 }