user-0 提问: 求助（数据结构）:为什么这个“取出函数运行不了，怎么改啊？”

回复:
user: user-1
content: 不保证对，仅供参考： #include<stdio.h> #define MAXLEN 100 typedef struct {     char vec[MAXLEN];     int len; } str;//定义结构体类型 str void ConcatStr(str *r1,str *r2)//连接串r1和r2放到串r1中 {     int i=0;     if(r1->len+r2->len>MAXLEN)         printf("两个串太长，无法连接!");     else     {         for(i=0;i<r2->len;i++)             r1->vec[r1->len+i]=r2->vec[i];         r1->vec[r1->len+i]='\0';         r1->len=r1->len+r2->len;     } } void SubStr(str *r,str **pr1,int i,int j)//从第i个位置 ，取j个位置 {     int k=0;     if(i+j-1>r->len)     {         printf("子串超界!");         return ;     }     else     {         for(k=0;k<j;k++)             (*pr1)->vec[k]=r->vec[i+k-1];         (*pr1)->len=j;         (*pr1)->vec[(*pr1)->len]='\0';     }     printf("取出字符为:");     puts((*pr1)->vec); } void DelStr(str *r,int i,int j)//从字符串r的第i个位置开始删除j个字符 {     int k=0;     if(i<1||i>r->len||j<1||i+j-1>r->len)         printf("位置参数数据错误或所要删除的子串超界!");     else     {         for(k=i+j-1;k<r->len;k++,i++)             r->vec[i-1]=r->vec[k];  //将后面的字符串前移覆盖         r->len=r->len-j;         r->vec[r->len]='\0';     } } str *InsStr(str*r,str*r1,int i)//在i个位置插入串r1 {     int k;     if(i<0||i>r->len+1||r->len+r1->len>MAXLEN)         printf("不能插入!");     else     {         for(k=r->len-1;k>=i-1;k--)             r->vec[r1->len+k]=r->vec[k];//后移，空出r1->len个位置         for(k=0;k<r1->len;k++)             r->vec[i-1+k]=r1->vec[k];         r->len=r->len+r1->len;         r->vec[r->len]='\0';     }     return r; } int IndexStr(str *r,str *r1)//模式匹配 {     int i,j,k;     for(i=0;r->vec[i];i++)         for(j=i,k=0;r->vec[j]==r1->vec[k];j++,k++)             if(!r1->vec[k+1])                 return i;     return 0; } int LenStr(str *r)//求串长 {     int i=0;     while(r->vec[i]!='\0')         i++;     return i; } str*CreateStr(str *r)//创建串 {     gets(r->vec);     r->len=LenStr(r);     return r; } int EqualStr(str *r1,str *r2)//串比较 {     int i;     for(i=0;r1->vec[i]==r2->vec[i]&&r1->vec[i]&&r2->vec[i];)         i++;     return(r1->vec[i]-r2->vec[i]); } int main() {     str a,b,c,d;     str *r=&a,*r1;     char choice;     int i,j,ch=1,k;     r->vec[0]='\0';     printf("\n");     printf("     串子系统\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("        0--返回\n");     while(ch!=0)     {         printf("请选择菜单号(0-8):");fflush(stdout);         rewind(stdin);scanf("%c",&choice);         switch(choice)         {         case '1':             printf("\n请输入一个字符串:");fflush(stdout);             gets(r->vec);             r->len=LenStr(r);             break;         case '2':             {                 printf("\n请输入要连接的串:");fflush(stdout);                 r1=CreateStr(&b);  //给串r1赋初值                 ConcatStr(r,r1);                 printf("\n连接以后的新串值为:");                 puts(r->vec);                 break;             }         case '3':             printf("\n请输入从第几个字符开始:");fflush(stdout);             rewind(stdin);scanf("%d",&i);             printf("\n请输入取出的连接字符数:");fflush(stdout);             rewind(stdin);scanf("%d",&j);             SubStr(r,&r1,i,j);             break;         case '4':             printf("\n请输入从第几个字符开始:  ");fflush(stdout);             rewind(stdin);scanf("%d",&i);             printf("\n请输入删除的连续字符数:");fflush(stdout);             rewind(stdin);scanf("%d",&j);             DelStr(r,i ,j);             break;         case '5':             {                 printf("\n请输入在第几个字符前插入:");fflush(stdout);                 rewind(stdin);scanf("%d",&i);                 printf("\n请输入所要插入的字符串:");                 r1=CreateStr(&b);                 InsStr(r,r1,i);                 break;             }         case '6':             {                 printf("\n请输入所要查找的字符串:");fflush(stdout);                 r1=CreateStr(&b);                 i=IndexStr(r,r1);                 if(i!=-1)                     printf("\n第一次出现的位置是第%d个\n",i);                 else                     printf("\n该字串不在其中\n");                 break;             }         case '7':             {                 printf("\n请输入第一个串:");fflush(stdout);                 gets(c.vec);                 printf("\n请输入第二个串:");fflush(stdout);                 gets(d.vec);                 k=EqualStr(&c,&d);                 if(k>0)                     printf("\n\t\t第一个串大!");                 else                     if(k<0)                         printf("\n\t\t第二个串大!");                     else                         printf("\n\t\t两个串一样大!");                 break;             }         case '8':             {                 printf("\n\t\t该串值为:");                 if(r->vec[0]=='0')                     printf("空!\n");                 else                     puts(r->vec);                 break;             }         case '0':             ch=0;break;         default:             printf("输入菜单有误，请重新输入!");break;         }     }     return 0; }