鱼C论坛

 找回密码
 立即注册
查看: 2778|回复: 7

[已解决]为什么会出现错误的指针?

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

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

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

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-len]=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. void substr(HString *S,HString T,int pos,int len)
  138. {
  139.         int i,j;
  140.         void printstr(HString *);
  141.         for(i=pos-1,j=0;pos+len-1;i++,j++)
  142.         {
  143.                 S->ch[j]=T.ch[i];
  144.         }
  145.         S->ch[j]='/0';
  146.         S->length=len;
  147.         printstr(S);
  148.         printf("恭喜你,寻找子串完毕.\n");
  149. }
  150.        

  151.        





  152. int main()
  153. {
  154.         HString T1,T2,T3,S;
  155.         char str[]="hsy";
  156.         char str2[]="cute";
  157.         initstr(&T1);
  158.         initstr(&S);
  159.         creatstr(&T1);
  160.         T2.ch=str;
  161.         T3.ch=str2;
  162.         T2.length=strlen(T2.ch);//T2.length=lengthstr(&T2);
  163.         T3.length=strlen(T3.ch);
  164.         S.ch='\0';
  165.         //initstr(&T2);
  166.         //creatstr(&T2);
  167.         //printstr(&T);
  168.         //concatstr(&T1,&T2);
  169.         //lengthstr(&T1);
  170.         //printstr(&T1);
  171.         //deletesubstr(&T1,4,3);
  172.         //insertsubstr(&T1,3,T2);
  173.         //printstr(&T1);
  174.         //Indexstr(&T1,1,T2);
  175.         //printstr(&T1);
  176.         //replacestr(&T1,T2,T3);
  177.         //printstr(&T1);
  178.         substr(&S,T1,5,4);
  179.         return 0;
  180. }
复制代码
最佳答案
2018-4-23 09:38:55
你的Hstring结构对象应该在初始化的时候给定ch变量的长度
QQ图片20180423092950.png
QQ图片20180423093003.png
QQ图片20180423093008.png
QQ图片20180423093013.png
QQ图片20180423093017.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-23 09:38:55 | 显示全部楼层    本楼为最佳答案   
你的Hstring结构对象应该在初始化的时候给定ch变量的长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-23 09:48:50 | 显示全部楼层
BngThea 发表于 2018-4-23 09:38
你的Hstring结构对象应该在初始化的时候给定ch变量的长度

可是我也不知道我要输入多长的字符串啊,我是在creatstr(字符串赋值)函数中才能计算出我的长度是多少
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 10:01:22 | 显示全部楼层
愿你 发表于 2018-4-23 09:48
可是我也不知道我要输入多长的字符串啊,我是在creatstr(字符串赋值)函数中才能计算出我的长度是多少

那就用malloc动态分配数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-23 10:33:27 | 显示全部楼层
BngThea 发表于 2018-4-23 10:01
那就用malloc动态分配数组

为什么啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 10:53:43 | 显示全部楼层

正是因为需求在实际程序运行中才确定数组的长度,才使用动态内存分配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-23 11:30:18 | 显示全部楼层
  1. void initstr(HString *T) //初始化,产生空串。
  2. {
  3. &nbsp; &nbsp; &nbsp; &nbsp; T->ch=(char*)malloc(sizeof(char)*MAXSIZE);
  4. &nbsp; &nbsp; &nbsp; &nbsp; if(!(T->ch))
  5. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("对不起,初始化失败。\n");
  6. &nbsp; &nbsp; &nbsp; &nbsp; else
  7. &nbsp; &nbsp; &nbsp; &nbsp; {
  8. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T->length=0;
  9. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("恭喜你,初始化成功。\n");
  10. &nbsp; &nbsp; &nbsp; &nbsp; }

  11. }
复制代码
我用了malloc的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-23 11:30:49 | 显示全部楼层
BngThea 发表于 2018-4-23 10:53
正是因为需求在实际程序运行中才确定数组的长度,才使用动态内存分配

我的initstr就是用malloc分配动态数组的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 18:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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