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);
}
     
     
     


    
  
希望各位不吝賜教,有空幫小弟把替換函數補一下,不勝感激!!!!

 

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