回 帖 发 新 帖 刷新版面

主题:求数据结构串的问题,求高手指点

#define MAXSIZE 100         /*串的最大长度*/
#include "stdio.h"
typedef struct
{   
   char ch[MAXSIZE];      /*存放串字符*/
   int len;               /*存放串的实际长度*/
} SqString;
void Assign(SqString &s,char t[])    /*赋值操作函数*/
{
    int i=0;
    while (t[i]!='\0')
    {
        s.ch[i]=t[i];
        i++;
    }
    s.len=i;
}
void Input(SqString &s)
{
    int i;
    char t[MAXSIZE];
    fflush(stdin);  /*清空缓冲区*/
    for(i=0; (t[i]=getchar()) != '\n'; i++);
     t[i] = '\0';      
      Assign(s,t); /*调用赋值操作函数*/
}
void InitStr(SqString &s)
{
    s.len = 0;
}
void StrCopy(SqString &s,SqString t)
{
    int i;
    for (i=0;i<t.len;i++)     /*复制字符串t的内容到字符串s中*/
    s.ch[i]=t.ch[i];
    s.len=t.len;           /*复制t的长度给s*/

}
int StrLength(SqString s)   
{
   return s.len;/*返回长度*/

int StrEqual(SqString s,SqString t) 
{
    int i=0;
    if (s.len!=t.len)
    return(0);/*如果长度不等,则两字符串不相等*/
    
     else          /*如果长度相等,则判断每个字符是否相等*/
    {
        for (i=0; i<s.len;i++)
           if (s.ch[i]!=t.ch[i])
           return(0);
          printf("字符串相等\n");  
          return(1);
    }
}
SqString Concat(SqString s,SqString t)  
{
    SqString r;     /*定义字符串r用来保存链接后的字符串*/
    int i,j;
    for (i=0;i<s.len;i++)   /*把字符串s复制到r中*/      
        r.ch[i]=s.ch[i];
    for(j=0;j<t.len;j++)    /*把字符串t紧接着复制到r中*/                               ;
        r.ch[j+s.len]=t.ch[j];
           r.len=s.len+t.len;        /*设置r的长度*/
    return(r);              

SqString SubStr(SqString s,int i,int j) 
{
    SqString t;
    int k;
    if (i<1 || i>s.len || j<1 || i+j>s.len+1)
        t.len=0;        
    else
    {
       for (k=i-1;k<i+j;k++)
            t.ch[k-i+1]=s.ch[k];  
       t.len=j;
    }
    return(t);

int Index(SqString s,SqString t)    
{
    int i=0,j=0,k;                /*i和j分别扫描主串s和子串t*/
    while (i<s.len && j<t.len)
    {   if (s.ch[i]=t.ch[j])    //对应字符相同,继续比较下一对
        {   i++;j++;        }
        else                    //主子串指针回溯重新开始下一次匹配
        {   i=i-j+1;j=0;    }
    }
    if (j>=t.len)   k=i-s.len;     //求出第一个字符的位置
    else  k=-1;     //置特殊值-1
    return(k);

int InsStr(SqString &s,int i,SqString t)    
{
    int j;
    if (i>s.len+1 || i<1)
        return(0);                  
    else 
    {
        for (i=0;i<t.len;i++)     /*在s中为待插入子串t移动出足够的存储单元*/
            s.len++; 
        for (j=0;j<t.len;j++)       /*在第i个位置开始插入子串t*/
            s.ch[i+j-1]=t.ch[j]; 
            s.len=s.len+t.len;     /*改变s的长度*/
        return(1);
    }
}
int DelStr(SqString &s,int i,int j)
{
    int k;
    SqString str;
    str.len=0;
    if (i>s.len||i<1||i+j>s.len+1)   /*如果位置不对则无法进行删除*/
        return(0);      
    else
    {   for (k=0;k<i-1;k++)    /*删除第i个位置开始的j个字符*/
            str.ch[k]=s.ch[k];
            for(k=i+j-1;k<s.len;k++)
                str.ch[k-j]=s.ch[k];
                s.len=s.len-j;         /*s的长度改变*/ 
        return(1);
    }
}
SqString RepStrAll(SqString &s,SqString s1,SqString s2) 
{
    int i;
    i=Index(s,s1);
    while (i>=0)
    {
       DelStr(s,i,s1.len);   /*删除i位置的s1*/
       InsStr(s,i,s2);       /*在i位置插入s2*/
       i=Index(s,s1);        /*查找下一个s1所在的位置i*/
    }
    return(s);
}
void DispStr(SqString s)    
{  int i;
   if(s.len>0)
   {
    for(i=0;i<s.len;i++)
        printf("%c",s.ch[i]);
        printf("\n");
    }
   else 
       printf("空字符串\n");
}
void Menu()
{

        printf("===========顺序串基本操作====================\n");
        printf("      1=======输入字符串s1和s2\n");
        printf("      2=======显示字符串及其长度\n");
        printf("      3=======判断s1和s2是否相等\n");
        printf("      4=======复制s2到s3中\n");
        printf("      5=======连接s1和s2到s3中\n");
        printf("      6=======求s3中指定位置指定长度的字串\n");
        printf("      7=======求s3中某一字串的位置\n");
        printf("      8=======在s3中插入字串\n");
        printf("      9=======在s3中删除字串\n");
        printf("      10======查找并替换s3中的字串\n");
        printf("      0=======退出\n");
        printf("==============================================\n");
printf("请选择:");}
void main()
{    
    int i,j,m;
    SqString s1,s2,s3,t,str;
    Menu();
    do{    
        scanf("%d",&m);
        switch(m)
        {
        case 1:
            printf("请输入s1:");
            Input(s1);
            printf("请输入s2:");
            Input(s2);
            printf("请选择操作编号,输入0退出:\n");
            break;
        case 2:
            printf("s1:");
            DispStr(s1);
            StrLength(s1);
            printf("\n");
            printf("s2:");
            DispStr(s2);
            StrLength(s2);
            printf("\n");
            printf("s3:");
            DispStr(s3);
            StrLength(s3);
            printf("\n");
            break;
        case 3:
            StrEqual(s1,s2);
            printf("请选择:");
            break;
        case 4:
            StrCopy(s3,s2);
            DispStr(s3);
            printf("请选择:");
            break;
        case 5:
            Concat(s3,s1);
            Concat(s1,s2);
            DispStr(s3);
            printf("请选择:");
            break;
        case 6:
            scanf("%d",&i);
            scanf("%d",&j);
            SubStr(str,i,j);
            DispStr(str);
            printf("请选择:");
            break;
        case 7:   
            Input(t);
            Index(s3,t);
            printf("请选择:");
            break;
        case 8:
            InsStr(s3,i,t);
            Input(t);
            scanf("%d",&i);
            DispStr(s3);
            printf("请选择:");
            break;
        case 9:
            DelStr(s3,i,j);
            scanf("%d",&i);
             scanf("%d",&j);
            DispStr(s3);
            break;
        case 10:
            RepStrAll(s3,s1,s2);
            Input(s1);
            Input(s2);
            DispStr(s3);
            printf("请选择:");
            break;
        case 0:
            break;
        default:break;
        }
    }while(m<=10);
}
如果你懂,或者不明白我问题的意思,麻烦加我Q1264553284,万分感激!!!

回复列表 (共6个回复)

沙发

说出你的问题,贴这么长的代码,谁看?

板凳


就是运行的时候,case2调用StrLength函数时不能输出字符串长度,还有StrEuqual函数调用无效!!!!

3 楼

StrLength只是返回长度,输出需要用printf来输出~~~~

4 楼

呜呜~貌似没有用,小妹刚学,现在是一头雾水啊,专家不吝赐教!!!

5 楼

printf("长度:%d",StrLen(s2));
试试这样吧。

6 楼


谢谢哈~

我来回复

您尚未登录,请登录后再回复。点此登录或注册