鱼C论坛

 找回密码
 立即注册
查看: 3231|回复: 2

[已解决]为什么我的replacestr函数错误??

[复制链接]
发表于 2018-4-20 23:16:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAXSIZE 60
  5. typedef struct{
  6.         char *ch;
  7.         int length;
  8. }HString;

  9. void initstr(HString *T) //初始化,产生空串。
  10. {
  11.         T->ch=(char*)malloc(sizeof(char)*MAXSIZE);
  12.         if(!(T->ch))
  13.                 printf("对不起,初始化失败。\n");
  14.         else
  15.         {
  16.                 T->length=0;
  17.                 printf("恭喜你,初始化成功。\n");
  18.         }

  19. }

  20. void creatstr(HString *T) //初始化开辟空间。
  21. {
  22.         char s[MAXSIZE];
  23.         int len,i;
  24.         printf("请输入您想要的字符串:");
  25.         gets(s);
  26.         len=strlen(s);

  27.         for(i=0;i<len;i++)
  28.         {
  29.                 T->ch[i]=s[i];
  30.         }
  31.         T->ch[i]='\0';
  32.         T->length=len;
  33.         printf("字符串赋值成功!\n");
  34. }

  35. void printstr(HString *T)
  36. {
  37.         printf("%s\n",T->ch);
  38.         printf("打印成功!\n");
  39. }

  40. void concatstr(HString *T1,HString *T2) //字符串连接
  41. {
  42.         int lengthstr(HString *T);
  43.         int i,j,len1,len2;
  44.         len1=lengthstr(T1);
  45.         len2=lengthstr(T2);
  46.         for(i=len1,j=0;i<=len1+len2;i++)
  47.         {
  48.                 T1->ch[i]=T2->ch[j];
  49.                 j++;
  50.         }
  51.         T1->length=len1+len2;
  52. }
  53. int lengthstr(HString *T)   //求字符串的长度
  54. {
  55.         int len,i;
  56.         len=0;
  57.         i=0;
  58.         while(T->ch[i]!='\0')
  59.         {
  60.                 len++;
  61.                 i++;
  62.         }
  63.         printf("您的字符串长度为:%d\n",len);
  64.         return len;
  65. }

  66. void deletesubstr(HString *T,int pos,int len) //删除从pos位置起的len个字符 注意应加上判断删除位置等是否正确,此处省略,有时间请补上。
  67. {
  68.         int i;
  69.         for(i=pos+len-1;i<T->length;i++)
  70.         {
  71.                 T->ch[i-2]=T->ch[i];
  72.         }
  73.         T->length=T->length-len;
  74.         T->ch[T->length]='\0';
  75. }

  76. void insertsubstr(HString *T,int pos,HString S) //在pos位置之前插入一个字符串S;
  77. {

  78.         int i,len,j;
  79.         len=S.length;
  80.         for(i=T->length-1;i>=pos-1;i--) //该循环用以使pos字符(包含pos字符)之后的每一个字符后移,为子串腾出位置。
  81.         {
  82.                 T->ch[i+len]=T->ch[i];
  83.         }
  84.         T->length=T->length+len;
  85.         T->ch[T->length]='\0';
  86.         i=pos-1;
  87.         for(i,j=0;j<len;j++,i++) //该循环用以将腾出的位置插入子串
  88.         {
  89.                 T->ch[i]=S.ch[j];
  90.         }
  91. }
  92. int Indexstr(HString *T,int pos,HString S)//从第pos个字符开始寻找子串S,若找到,则返回其位置。
  93. {
  94.         int i,j;
  95.         i=pos-1;
  96.         j=0;
  97.         while(i<=T->length-1&&j<=S.length-1)
  98.         {
  99.                 if(T->ch[i]==S.ch[j])
  100.                 {
  101.                         ++i;
  102.                         ++j;
  103.                 }
  104.                 else
  105.                 {
  106.                         i=i-j+1;
  107.                         j=0;
  108.                 }
  109.         }
  110.         if(j>=S.length)
  111.         {
  112.                 printf("您所需要查询的子串在第%d个位置\n",i-S.length+1);
  113.                 return i-S.length+1;
  114.         }
  115.         else
  116.         {
  117.                 printf("尚未查询到您需要的子串\n");
  118.                 return 0;
  119.         }
  120. }
  121. void replacestr(HString *T,HString T1,HString T2)//将字符串T中等于T1的子串替换成为T2
  122. {
  123.         int Indexstr(HString *,int ,HString );
  124.         void insertsubstr(HString *,int ,HString );
  125.         void deletesubstr(HString *,int ,int );
  126.         int pos;
  127.         pos=0;
  128.         pos=Indexstr(T,1,T1);
  129.         while(pos)
  130.         {
  131.                 deletesubstr(T,pos ,T1.length );
  132.                 insertsubstr(T,pos ,T2);
  133.                 pos=Indexstr(T,pos,T1);
  134.         }
  135.         printf("替换完毕.\n");
  136. }






  137. int main()
  138. {
  139.         HString T1,T2,T3;
  140.         char str[]="hsy";
  141.         char str2[]="cute";
  142.         initstr(&T1);
  143.         creatstr(&T1);
  144.         T2.ch=str;
  145.         T3.ch=str2;
  146.         T2.length=strlen(T2.ch);//T2.length=lengthstr(&T2);
  147.         T3.length=strlen(T3.ch);
  148.         //initstr(&T2);
  149.         //creatstr(&T2);
  150.         //printstr(&T);
  151.         //concatstr(&T1,&T2);
  152.         //lengthstr(&T1);
  153.         //printstr(&T1);
  154.         //deletesubstr(&T1,4,2);
  155.         //insertsubstr(&T1,3,T2);
  156.         //printstr(&T1);
  157.         //Indexstr(&T1,1,T2);
  158.         printstr(&T1);
  159.         replacestr(&T1,T2,T3);
  160.         printstr(&T1);
  161.         return 0;
  162. }
复制代码
@人造人
最佳答案
2018-4-21 03:43:31
很明显,deletesubstr函数不是预期的那样工作

无标题.png
无标题1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-21 03:43:31 | 显示全部楼层    本楼为最佳答案   
很明显,deletesubstr函数不是预期的那样工作

无标题.png
无标题1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-21 03:57:55 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAXSIZE 60
  5. typedef struct
  6. {
  7.         char *ch;
  8.         int length;
  9. } HString;

  10. void initstr(HString *T) //初始化,产生空串。
  11. {
  12.         //T->ch = (char*)malloc(sizeof(char)*MAXSIZE);        // 听某本书上说,永远都不用写sizeof(char),sizeof(char)恒为1
  13.         T->ch = malloc(MAXSIZE);
  14.         if(!(T->ch))
  15.                 printf("对不起,初始化失败。\n");
  16.         else
  17.         {
  18.                 T->length = 0;
  19.                 printf("恭喜你,初始化成功。\n");
  20.         }

  21. }

  22. void creatstr(HString *T) //初始化开辟空间。
  23. {
  24.         //char s[MAXSIZE];
  25.         //int len, i;
  26.         printf("请输入您想要的字符串:");
  27.         //gets(s);
  28.         //len = strlen(s);

  29.         //for(i = 0; i<len; i++)
  30.         //{
  31.         //        T->ch[i] = s[i];
  32.         //}
  33.         //T->ch[i] = '\0';
  34.         //T->length = len;



  35.         // 为什么要用gets,把字符串get到s,然后再复制到T->ch ?  ^_^
  36.         fgets(T->ch, MAXSIZE, stdin);
  37.         T->length = strlen(T->ch) - 1;        // '\n'
  38.         T->ch[T->length] = '\0';



  39.         printf("字符串赋值成功!\n");
  40. }

  41. void printstr(HString *T)
  42. {
  43.         printf("%s\n", T->ch);
  44.         printf("打印成功!\n");
  45. }

  46. void concatstr(HString *T1, HString *T2) //字符串连接
  47. {
  48.         int lengthstr(HString *T);
  49.         int i, j, len1, len2;
  50.         len1 = lengthstr(T1);
  51.         len2 = lengthstr(T2);
  52.         for(i = len1, j = 0; i <= len1 + len2; i++)
  53.         {
  54.                 T1->ch[i] = T2->ch[j];
  55.                 j++;
  56.         }
  57.         T1->length = len1 + len2;
  58. }
  59. int lengthstr(HString *T)   //求字符串的长度
  60. {
  61.         int len, i;
  62.         len = 0;
  63.         i = 0;
  64.         while(T->ch[i] != '\0')
  65.         {
  66.                 len++;
  67.                 i++;
  68.         }
  69.         printf("您的字符串长度为:%d\n", len);
  70.         return len;
  71. }

  72. void deletesubstr(HString *T, int pos, int len) //删除从pos位置起的len个字符 注意应加上判断删除位置等是否正确,此处省略,有时间请补上。
  73. {
  74.         int i;
  75.         for(i = pos + len - 1; i < T->length; i++)
  76.         {
  77.                 T->ch[i - len] = T->ch[i];
  78.         }
  79.         T->length = T->length - len;
  80.         T->ch[T->length] = '\0';
  81. }

  82. void insertsubstr(HString *T, int pos, HString S) //在pos位置之前插入一个字符串S;
  83. {

  84.         int i, len, j;
  85.         len = S.length;
  86.         for(i = T->length - 1; i >= pos - 1; i--) //该循环用以使pos字符(包含pos字符)之后的每一个字符后移,为子串腾出位置。
  87.         {
  88.                 T->ch[i + len] = T->ch[i];
  89.         }
  90.         T->length = T->length + len;
  91.         T->ch[T->length] = '\0';
  92.         i = pos - 1;
  93.         for(i, j = 0; j<len; j++, i++) //该循环用以将腾出的位置插入子串
  94.         {
  95.                 T->ch[i] = S.ch[j];
  96.         }
  97. }
  98. int Indexstr(HString *T, int pos, HString S)//从第pos个字符开始寻找子串S,若找到,则返回其位置。
  99. {
  100.         int i, j;
  101.         i = pos - 1;
  102.         j = 0;
  103.         while(i <= T->length - 1 && j <= S.length - 1)
  104.         {
  105.                 if(T->ch[i] == S.ch[j])
  106.                 {
  107.                         ++i;
  108.                         ++j;
  109.                 }
  110.                 else
  111.                 {
  112.                         i = i - j + 1;
  113.                         j = 0;
  114.                 }
  115.         }
  116.         if(j >= S.length)
  117.         {
  118.                 printf("您所需要查询的子串在第%d个位置\n", i - S.length + 1);
  119.                 return i - S.length + 1;
  120.         }
  121.         else
  122.         {
  123.                 printf("尚未查询到您需要的子串\n");
  124.                 return 0;
  125.         }
  126. }
  127. void replacestr(HString *T, HString T1, HString T2)//将字符串T中等于T1的子串替换成为T2
  128. {
  129.         int Indexstr(HString *, int, HString);
  130.         void insertsubstr(HString *, int, HString);
  131.         void deletesubstr(HString *, int, int);
  132.         int pos;
  133.         pos = 0;
  134.         pos = Indexstr(T, 1, T1);
  135.         while(pos)
  136.         {
  137.                 deletesubstr(T, pos, T1.length);
  138.                 insertsubstr(T, pos, T2);
  139.                 pos = Indexstr(T, pos, T1);
  140.         }
  141.         printf("替换完毕.\n");
  142. }

  143. int main()
  144. {
  145.         HString T1, T2, T3;
  146.         char str[] = "hsy";
  147.         char str2[] = "cute";
  148.         initstr(&T1);
  149.         creatstr(&T1);
  150.         T2.ch = str;
  151.         T3.ch = str2;
  152.         T2.length = strlen(T2.ch);//T2.length=lengthstr(&T2);
  153.         T3.length = strlen(T3.ch);
  154.         //initstr(&T2);
  155.         //creatstr(&T2);
  156.         //printstr(&T);
  157.         //concatstr(&T1,&T2);
  158.         //lengthstr(&T1);
  159.         //printstr(&T1);
  160.         //deletesubstr(&T1,4,2);
  161.         //insertsubstr(&T1,3,T2);
  162.         //printstr(&T1);
  163.         //Indexstr(&T1,1,T2);
  164.         printstr(&T1);
  165.         replacestr(&T1, T2, T3);
  166.         printstr(&T1);
  167.         return 0;
  168. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 04:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表