C语言实现字符串的操作

数据结构的字符串操作,本人写了八个,有一个替换操作基于这个程序的问题,没写出来,有点水,呵呵,大家给点意见哦

下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

typedef  struct{
         char *ch;
         int length;
         }HString;

//自定义的函数
int strlength(HString l);
void strAssign(HString m,HString n);
void strConcat(HString u,HString v);
void Substr(HString x,int i,int j);
int Strcmp(HString x,HString y);
int index(HString x,HString y,int i); 
void strinsert(HString s,int i,HString t);
void StrDelete(HString s,int i,int len);
 
int main()
{
    system("color e4");
    
    HString L,P,R; 
    char *l,*p,*r;
    int n,m,o;
    int x,y;
     
    l = L.ch = (char *)malloc(sizeof(char));
    p = P.ch = (char *)malloc(sizeof(char));
    r = R.ch = (char *)malloc(sizeof(char));
    
    
    printf("请选择你的操作(1~9)进行操作,输入0结束:\n");
    printf("   ----------1.求串长----------\n");
    printf("   ----------2.串赋值----------\n");
    printf("   ----------3.串连接----------\n");
    printf("   ----------4.求子串----------\n");
    printf("   ----------5.串比较----------\n");
    printf("   ---------6.子串定位----------\n");
    printf("   ----------7.串插入----------\n");
    printf("   ----------8.串删除----------\n");
    printf("   ----------9.串替换----------\n");
    
    while(scanf("%d",&n))
    {
        if(n == 0)
        {
             printf("Error\n");
             break;
        }
        
        switch(n)
        {
                 case 1:{
                      getchar();
                      printf("输入字符串:\n"); 
                      gets(l);//读入字符串
                      printf("串长:%d\n",strlength(L));//调用函数,返回字符串的长度
                      break;
                      }
                      
                 case 2:{
                      printf("输入第一个字符串:");
                      getchar();
                      gets(l);
                      printf("第二个:");
                      gets(r);
                      strAssign(L,R);
                      break;
                      }
                 case 3:{
                      printf("输入第一个字符串:");
                      getchar();
                      gets(l);
                      printf("第二个:");
                      gets(r);
                      strConcat(L,R);
                      break;
                      }
                 case 4:{
                      getchar();
                      printf("输入字符串:\n"); 
                      gets(l);//读入字符串
                      printf("输入要求的子串:");
                      scanf("%d%d",&x,&y);
                      Substr(L,x,y);
                      break;
                      }
                 case 5:{
                      printf("输入第一个字符串:");
                      getchar();
                      gets(l);
                      printf("第二个:");
                      gets(r);
                      printf("结果是:%d\n",Strcmp(L,R));
                      break;
                      }
                 case 6:{
                      printf("输入第一个字符串:");
                      getchar();
                      gets(l);
                      printf("第二个:");
                      gets(r);
                      printf("输入要返回的位置:");
                      scanf("%d",&o);
                      printf("结果是:%d\n",index(L,R,o));
                      break;
                      }
                 case 7:{
                      printf("输入第一个字符串:");
                      getchar();
                      gets(l);
                      printf("第二个:");
                      gets(r);
                      printf("输入你要插入的位置:");
                      scanf("%d",&m);
                      strinsert(L,m,R);
                      puts(L.ch);
                      break;
                      }
                 case 8:{
                      getchar();
                      printf("输入字符串:\n"); 
                      gets(l);//读入字符串
                      printf("输入要删除的编号:");
                      scanf("%d%d",&m,&n);
                      StrDelete(L,m,n);
                      break;
                      }
                      
                      
                      
                      
                      
        }
    }
    
    system("pause");
    return 0;
}

int strlength(HString l)
{
    return strlen(l.ch);
}

void strAssign(HString m,HString n)//串赋值函数 2
{
     if(strlen(n.ch) > m.length){
         free(m.ch);
         m.ch = (char *)realloc(m.ch,3 * m.length);
     }
     
     strcpy(m.ch,n.ch);
     printf("赋值操作: ");
     printf("第一个串被改为:");
     puts(m.ch);
}   

void strConcat(HString u,HString v)//串连接函数 3
{
     if(u.length < (strlen(u.ch) + strlen(v.ch) + 2)){//第一个串的总内存不够使用,则重新申请 
          free(u.ch);
          u.ch = (char *)realloc(u.ch,(u.length + v.length + 4));
     }
     
     strcat(u.ch,v.ch);
     printf("串连接操作:");
     puts(u.ch);
}

void Substr(HString x,int i,int j)//求字串函数 4
{
     int w;
     if(i < 0 || j < 0 || i > strlen(x.ch) || j > (strlen(x.ch)))
          printf("Error\n");
          
     for(w = i; w <= j; w++)
     printf("%c",x.ch[w]);
}

int Strcmp(HString x,HString y)//串比较函数,若前者等于后者,返回0;若大于,返回正整数,若小于,返回负整数。5 
{
    return strcmp(x.ch,y.ch);
}

int index(HString s,HString t,int i)
{
    int x,y;
    
    x = i;
    y = 0;
    
    while(s.ch[x + y] != '\0' && t.ch[y] != '\0')
    {
         if(s.ch[x + y] == t.ch[y])
                   y++;
         else
         {
             x++;
             y = 0;
         }
     }  
         
    if(t.ch[y] == '\0')
        return x;
    else
        return -1;
        
}
            
void strinsert(HString s,int i,HString t)//经历好久终于攻破!!!!吐血啊 
{
     int x,y,L1,L2;
     
     L1 = strlen(s.ch);
     L2 = strlen(t.ch);
     
     for(x = L1 - 1;x >= i - 1;x--)
            s.ch[x + L2] = s.ch[x];
     s.ch[L1 + L2] = '\0';

     for(x = i - 1,y = 0; y < L2; x++,y++)
         s.ch[x] = t.ch[y];
}

void StrDelete(HString s,int i,int len)//算法是,把要保留的存入一个数组中,把要求删除的舍弃,输出新串即可 
{
     char ch[100];
     int x,y,z;
     
     for(x = 0,y = 0; x < i; x++,y++)
     ch[y] = s.ch[x];
     
     z = strlen(ch);
     
     for(x = len + 1,y = z; s.ch[x] != '\0'; x++,y++)
     ch[y] = s.ch[x];
     
     ch[strlen(s.ch) - len + i - 1] = '\0'; 
     
     puts(ch);
}
     
     
     


    
  
希望各位不吝赐教,有空帮小弟把替换函数补一下,不胜感激!!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章