能帮忙看看这个代码吗,有个错误看不懂

VIPGSHD_3701 2020-11-07 10:33:59
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

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

int initstring(HString *T)
{
(*T).length=0;
(*T).ch=NULL;
}
int StrAssign(HString &T,char *chars)
{
int len,i;
char *c;
if(T.ch)
free(T.ch);
len=strlen(chars);
for(i=0,c=chars;*c;++i,++c)
if(!i)
{
T.ch=NULL;
T.length=0;
}
else
{
if(!(T.ch=(char*)malloc(i*sizeof(char))))
exit(0);
for(i=0;i<len;i++)
T.ch[i]=chars[i];
T.length=i;
}
return 1;
}

int strinsert(HString &S,int pos, HString T)
{
int i,j;
if(pos<1||pos>S.length+1)
return 0;
if(T.length)
{
if(!(S.ch=(char *)realloc(S.ch,(S.length+T.length)*sizeof(char))))
exit(0);
for(i=S.length-1;i>pos-1;--i)
S.ch[i+T.length]=S.ch[i];
for(i=pos-1,j=0;i<=pos+T.length-2;i++,j++)
S.ch[i]=T.ch[j];
S.length+=T.length;
}
return 1;
}
int SubString(HString &Sub, HString &S, int pos, int len)
{ int i,j;
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
return 0;
if(Sub.ch)
free(Sub.ch);
if(!len)
{
Sub.ch=NULL;
Sub.length=0;
}
else
{
Sub.ch=(char *)malloc(len *sizeof(char));
for(i=pos-1,j=0;i<=pos+len-2;i++,j++)
Sub.ch[j]=S.ch[i];
S.length=len;
}

int strdelete(HString &S, int pos, int len)
{
int i;
for(i=pos+len;i<=S.length;i++)
{
S.ch[i-len-1]=S.ch[i-1];
}
S.length-=len;
return 0;
}



int Strlength(HString &S)
{
return S.length;
}


int concat(HString &T, HString S1,HString S2)
{
int i,j;
if(T.ch)
free(T.ch);
if(!(T.ch=(char *)malloc((S1.length+S2.length)*sizeof(char))))
exit(0);
for(i=0;i<S1.length;i++)
T.ch[i]=S1.ch[i];
T.length=S1.length+S2.length;
for(i=0,j=S1.length;j<T.length-1;j++,i++)
T.ch[j]=S2.ch[i];
return 1;
}
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 index(HString S,HString T,int pos)
{
HString sub;
int i,n,m;
if(pos>0)
{
n=Strlength(S);
m=Strlength(T);
i=pos;
while(i<=n-m+1)
{
SubString(sub,S,i,m);
if(strcompare(sub,T)!=0)
++i;
else return i;
}
}
return 0;
}

int main()
{
int i;
HString S,W,P,D;
HString Sub;
HString M[]={"cde"};
char T[]={"abcdefg"};

char k[]={"123"};
char h[]={"456"};
initstring(&S);
StrAssign(S,T);

SubString(Sub,S,2,3);
for(i=0;i<3;i++)
printf("%c",Sub.ch[i]);
index(S,M,1);

strdelete(S,5,2);

initstring(&W);
initstring(&P);
StrAssign(W,k);
StrAssign(P,h);
strcompare(W,P);
concat(D,W,P);
return 0;
}

...全文
467 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qzjhjxj 2021-02-27
  • 打赏
  • 举报
回复
修改完工,供参考:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

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

int initstring(HString *T)
{
    (*T).ch=NULL;
    (*T).length=0;
}

int StrAssign(HString &T,char *chars)
{
    int len,i;
    char *c;
    if(T.ch)
      free(T.ch);
    len=strlen(chars);
    for(i=0,c=chars;*c;++i,++c)
       if(!i)
         {
           T.ch=NULL;
           T.length=0;
         }
       else
         {
           if(!(T.ch=(char*)malloc(i*sizeof(char))))
             exit(0);
           for(i=0;i<len;i++)
              T.ch[i]=chars[i];
           T.length=i;
         }
    return 1;
}

int strinsert(HString &S,int pos, HString T)
{
    int i,j;
    if(pos<1||pos>S.length)
       return 0;
    if(T.length)
      {
        if(!(S.ch=(char *)realloc(S.ch,(S.length+T.length)*sizeof(char))))
           exit(0);
        for(i=S.length-1;i>pos-1;--i)
           S.ch[i+T.length]=S.ch[i];
        for(i=pos,j=0;i<=pos+T.length-1;i++,j++)
           S.ch[i]=T.ch[j];
        S.length+=T.length;
      }
    return 1;
}

int SubString(HString &Sub, HString S, int pos, int len)
{
    int i,j;
    if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
      return 0;
    if(Sub.ch)
      free(Sub.ch);
    if(!len)
      {
        Sub.ch=NULL;
        Sub.length=0;
      }
    else
      {
        Sub.ch=(char *)malloc(len *sizeof(char));
        for(i=pos-1,j=0;i<=pos+len-2;i++,j++)
            Sub.ch[j]=S.ch[i];
        Sub.length=len;
      }
}

int strdelete(HString &S, int pos, int len)
{
    int i;
    if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
      return 0;
    for(i=pos+len;i<=S.length;i++)
      {
        S.ch[i-len-1]=S.ch[i-1];
      }
    S.length-=len;
    return 0;
}

int Strlength(HString &S)
{
    return S.length;
}

int concat(HString &T, HString S1,HString S2)
{
    int i,j;
    if(T.ch)
      free(T.ch);
    if(!(T.ch=(char *)malloc((S1.length+S2.length)*sizeof(char))))
      exit(0);
    T.length=S1.length+S2.length;
    for(i=0;i<S1.length;i++)
       T.ch[i]=S1.ch[i];
    for(i=0,j=S1.length;j<T.length;j++,i++)
       T.ch[j]=S2.ch[i];
    return 1;
}

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 index(HString &S,HString *T,int pos)
{
   HString sub;
   int i,n,m;
   if(pos>0)
    {
       n=Strlength(S);
       m=Strlength(*T);
       i=pos;
       while(i<=n-m+1)
           {
             SubString(sub,S,i,m);
             if(strcompare(sub,*T)!=0)
               ++i;
             else return i;
           }
    }
   return 0;
}

int main()
{
   int i;
   HString S,W,P,D;
   HString Sub;
   HString M[]={"g",1};
   char    T[]={"abcdefg"};

   char k[]={"123"};
   char h[]={"456"};

   initstring(&S);
   StrAssign(S,T);
   printf("StrAssign(S,T): ");
   for(i=0;i<S.length;i++)
      printf("%c",S.ch[i]);
   printf("\n");
   
   SubString(Sub,S,2,3);//取子串
   printf("SubString(Sub,S,2,3): ");
   for(i=0;i<Sub.length;i++)
      printf("%c",Sub.ch[i]);
   printf("\n");

   printf("index(S,M,1): %d\n",index(S,M,1));//子串M在主串S中起始位置,pos=开始位查找,pos=0时直接返回


   strdelete(S,7,1);//删字符
   printf("strdelete(S,7,1): ");
   for(i=0;i<S.length;i++)
      printf("%c",S.ch[i]);
   printf("\n");

   initstring(&W);//初始化W
   initstring(&P);//初始化P
   StrAssign(W,k);
   StrAssign(P,h);

   printf("strcompare(W,P): ");
   if(strcompare(W,P)==0) printf("identical\n");//比较
   else                   printf("different\n");

   initstring(&D);//初始化D
   concat(D,W,P);//链接D=W+P
   printf("concat(D,W,P): ");
   for(i=0;i<D.length;i++)
      printf("%c",D.ch[i]);
   printf("\n");

   strinsert(D,5,S);//插入
   printf("strinsert(D,5,S): ");
   for(i=0;i<D.length;i++)
      printf("%c",D.ch[i]);
   printf("\n");

   return 0;
}

//StrAssign(S,T): abcdefg
//SubString(Sub,S,2,3): bcd
//index(S,M,1): 7
//strdelete(S,7,1): abcdef
//strcompare(W,P): different
//concat(D,W,P): 123456
//strinsert(D,5,S): 12345abcdef6
//请按任意键继续. . .
赵4老师 2021-02-26
  • 打赏
  • 举报
回复
偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。” 的方法解决的。
qzjhjxj 2021-02-26
  • 打赏
  • 举报
回复
index(S,M,1);strdelete(S,5,2);两函数功能没实现,strinsert(HString &S,int pos, HString T)函数没调试,其余修改如下,供参考:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

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

int initstring(HString *T)
{
    (*T).ch=NULL;
    (*T).length=0;
}

int StrAssign(HString &T,char *chars)
{
    int len,i;
    char *c;
    if(T.ch)
      free(T.ch);
    len=strlen(chars);
    for(i=0,c=chars;*c;++i,++c)
       if(!i)
         {
           T.ch=NULL;
           T.length=0;
         }
       else
         {
           if(!(T.ch=(char*)malloc(i*sizeof(char))))
             exit(0);
           for(i=0;i<len;i++)
              T.ch[i]=chars[i];
           T.length=i;
         }
    return 1;
}

int strinsert(HString &S,int pos, HString T)
{
    int i,j;
    if(pos<1||pos>S.length+1)
       return 0;
    if(T.length)
      {
        if(!(S.ch=(char *)realloc(S.ch,(S.length+T.length)*sizeof(char))))
           exit(0);
        for(i=S.length-1;i>pos-1;--i)
           S.ch[i+T.length]=S.ch[i];
        for(i=pos-1,j=0;i<=pos+T.length-2;i++,j++)
           S.ch[i]=T.ch[j];
        S.length+=T.length;
      }
    return 1;
}

int SubString(HString &Sub, HString &S, int pos, int len)
{
    int i,j;
    if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
      return 0;
    if(Sub.ch)
      free(Sub.ch);
    if(!len)
      {
        Sub.ch=NULL;
        Sub.length=0;
      }
    else
      {
        Sub.ch=(char *)malloc(len *sizeof(char));
        for(i=pos-1,j=0;i<=pos+len-2;i++,j++)
            Sub.ch[j]=S.ch[i];
        S.length=len;
      }
}

int strdelete(HString &S, int pos, int len)
{
    int i;
    for(i=pos+len;i<=S.length;i++)
      {
        S.ch[i-len-1]=S.ch[i-1];
      }
    S.length-=len;
    return 0;
}

int Strlength(HString &S)
{
    return S.length;
}

int concat(HString &T, HString S1,HString S2)
{
    int i,j;
    if(T.ch)
      free(T.ch);
    if(!(T.ch=(char *)malloc((S1.length+S2.length)*sizeof(char))))
      exit(0);
    T.length=S1.length+S2.length;
    for(i=0;i<S1.length;i++)
       T.ch[i]=S1.ch[i];
    for(i=0,j=S1.length;j<T.length;j++,i++)
       T.ch[j]=S2.ch[i];
    return 1;
}

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 index(HString &S,HString *T,int pos)
{
   HString sub;
   int i,n,m;
   if(pos>0)
    {
       n=Strlength(S);
       m=Strlength(*T);
       i=pos;
       while(i<=n-m+1)
           {
             SubString(sub,S,i,m);
             if(strcompare(sub,*T)!=0)
               ++i;
             else return i;
           }
    }
   return 0;
}

int main()
{
   int i;
   HString S,W,P,D;
   HString Sub;
   HString M[]={{"cde",3},{"abc",3},{"efg",3}};//M[]={"cde"};这个数组定义?
   char    T[]={"abcdefg"};

   char k[]={"123"};
   char h[]={"456"};

   initstring(&S);
   StrAssign(S,T);
 
   SubString(Sub,S,2,3);
   for(i=0;i<3;i++)
      printf("%c",Sub.ch[i]);
   printf("\n");
   index(S,M,1);
   strdelete(S,5,2);
   puts(S.ch);    //看看结果
   
   initstring(&W);//初始化W
   initstring(&P);//初始化P
   StrAssign(W,k);
   StrAssign(P,h);
   strcompare(W,P);//比较
   initstring(&D); //初始化D
   concat(D,W,P);//链接D=W+P
   puts(D.ch);  //看看结果
   
   return 0;
}

//bcd
//abcdefg
//123456
//请按任意键继续. . .
大雾 2021-02-25
  • 打赏
  • 举报
回复
很显然是strdelete上边的函数少了右括号,导致strdelete函数被认为是定义再另外一个函数内。

用中文做程序文件名还真是有创意啊
yqy1234hf 2020-11-08
  • 打赏
  • 举报
回复
你这个是要做什么 错误提示是什么 你的处理过程是什么? 提问题前先把你要做什么 怎么做 然后错误提示标注出来 & 这个是取地址符 在函数的参数是地址 类型 函数名 函数参数 类型 地址
VIPGSHD_3701 2020-11-08
  • 打赏
  • 举报
回复
所有的函数定义都是不合法的
VIPGSHD_3701 2020-11-08
  • 打赏
  • 举报
回复
要做的是串的基本操作及实现

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧