奥普瓯江 发表于 2020-1-13 14:16:55

为什么一个字符串同一个下表两次引用数据不一样?求next数组

本帖最后由 奥普瓯江 于 2020-1-13 14:52 编辑

这个程序里面为什么str2这个里面的数据在随后输出的时候变化了呢?
#include <stdio.h>


int main()
{
        char str1[] = "ababaaababa";
        char str2;
        int next;
        int i = 1, j = 0;
        str2 = sizeof(str1);

        while(i <= str2)
        {
                str2 = str1;
                i++;
        }


        i = 1;
        j = 0;
        next = 0;
        printf("***%d\n", str2);    //这个字符串中输出的是12
        while (i < str2)
        {
                if (j == 0 || str2 == str2)
                {
                        i++;
                        j++;
                        next = j;
                printf("%d\n", next);
                }
                else
                {
                        j = next;
                }
        }

        printf("***%d\n", str2);   //为什么这里输出的是6呢,在这个程序中我并没有给str2下标0,处从新赋值
        return 0;
}
我在这个图片中用米号标注了

人造人 发表于 2020-1-13 14:26:20

贴出你所期望的执行结果和现在的执行结果
如果有必要,再附加一些说明

pengjiandong 发表于 2020-1-13 14:38:27

你说的意思是str1 中有11个字符,却为什么在 str2 中保存的是12吗? 如果我对问题的理解没有错的话,导致这个现象的原因是sizeof()这个函数针对字符串时会多算一个字符串结束符的空间

奥普瓯江 发表于 2020-1-13 14:47:06

pengjiandong 发表于 2020-1-13 14:38
你说的意思是str1 中有11个字符,却为什么在 str2 中保存的是12吗? 如果我对问题的理解没有错的话,导 ...

不是的,那个我知道是因为str1字符中还有一个'\0',我说的是str字符串中0这个下标应该记录的是12个字符串为什么我在下面printf输出会出来6个,

奥普瓯江 发表于 2020-1-13 14:52:39

人造人 发表于 2020-1-13 14:26
贴出你所期望的执行结果和现在的执行结果
如果有必要,再附加一些说明

我从新加了一些说明,还请帮忙解答一下谢谢

pengjiandong 发表于 2020-1-13 15:48:05

奥普瓯江 发表于 2020-1-13 14:47
不是的,那个我知道是因为str1字符中还有一个'\0',我说的是str字符串中0这个下标应该记录的是12个字符串 ...

我在在线编辑器中拷贝了你的程序,得到的最后输出是***12

奥普瓯江 发表于 2020-1-13 15:59:14

pengjiandong 发表于 2020-1-13 15:48
我在在线编辑器中拷贝了你的程序,得到的最后输出是***12

好的吧那就有可能是我这个编辑器的问题,我这个用的是vc 6.0太老了

人造人 发表于 2020-1-13 16:39:31

#include <stdio.h>


int main()
{
        char str1[] = "ababaaababa";
        char str2;
        int next;
        int i = 1, j = 0;
        str2 = sizeof(str1);                // str2 = 12

        while(i <= str2)                // i <= 12    ???
        {
                str2 = str1;        // str2存在吗?
                i++;
        }


        i = 1;
        j = 0;
        next = 0;
        printf("***%d\n", str2);    //这个字符串中输出的是12
        while(i < str2)
        {
                if(j == 0 || str2 == str2)
                {
                        i++;
                        j++;
                        next = j;
                        printf("%d\n", next);
                }
                else
                {
                        j = next;
                }
        }

        printf("***%d\n", str2);   //为什么这里输出的是6呢,在这个程序中我并没有给str2下标0,处从新赋值
        return 0;
}

奥普瓯江 发表于 2020-1-13 17:27:45

本帖最后由 奥普瓯江 于 2020-1-13 17:29 编辑


人造人 发表于 2020-1-13 16:39


#include <stdio.h>


int main()
{
      char str1[] = "ababaaababa";
      char str2;
      int next;
      int i = 1, j = 0;
      str2 = sizeof(str1);                // str2 = 12

      while(i <= str2)                // i <= 12    ???//这里是我错了,应该是11但是执行下来还是一样的,声明的时候是12执行的时候是从1开始执行但是这也不应该影响str中的数据吧为什么这里的数据会变呢?
      {
                str2 = str1;      // str2存在吗?
                i++;
      }


      i = 1;
      j = 0;
      next = 0;
      printf("***%d\n", str2);    //这个字符串中输出的是12
      while(i < str2)
      {
                if(j == 0 || str2 == str2)
                {
                        i++;
                        j++;
                        next = j;
                        printf("%d\n", next);
                }
                else
                {
                        j = next;
                }
      }

      printf("***%d\n", str2);   //为什么这里输出的是6呢,在这个程序中我并没有给str2下标0,处从新赋值
      return 0;
}

奥普瓯江 发表于 2020-1-13 17:31:07

人造人 发表于 2020-1-13 16:39


是不是因为我的编译器有问题所以造成的,我用的是vc 6.0用虚拟机加载的

人造人 发表于 2020-1-13 17:32:17

奥普瓯江 发表于 2020-1-13 17:27


首先把数组越界访问这个问题修复了,然后把修复后的代码贴出来,然后附上你期望的执行结果和现在的执行结果

人造人 发表于 2020-1-13 17:35:02

奥普瓯江 发表于 2020-1-13 17:31
是不是因为我的编译器有问题所以造成的,我用的是vc 6.0用虚拟机加载的

不是,编译器的确可能出问题,不过概率极低,你要明白,编译器有这么多人在用,怎么可能轻易就出问题
出问题后首先怀疑的是你自己,而不是编译器

奥普瓯江 发表于 2020-1-14 12:01:41

本帖最后由 奥普瓯江 于 2020-1-14 12:04 编辑

人造人 发表于 2020-1-13 17:35
不是,编译器的确可能出问题,不过概率极低,你要明白,编译器有这么多人在用,怎么可能轻易就出问题
出 ...

溢出什么的我都已经调整了但是还会出现数值变动
#include <stdio.h>

int main()
{
        char str1[] = "ababaaababa";
        char str2;
        int next;
        int i = 1, j = 0;
        str2 = sizeof(str1);   //我把数字储存在了字符类型中是不是这个出现了溢出呢?

       
        while (i < str2)//这里的相等什么的我都调整了但是到下面还是会出现错误
        {
                str2 = str1;
                //printf("%d\n", sizeof(str2));
                i++;
        }

        i = 1;
        j = 0;
        next = 0;

        while (i < str2)
        {
                if(0 == j || str2 == str2)
                {
                        i++;
                        j++;
                        next = j;
                }
                else
                {
                        j = next;
                }
        }

        i = 1;
        printf("%d ", str2);//到这里str下标0的数值就变为一半了?
        while (i < 12)
        {
                printf("%d %d\n", i, next);
                i++;
        }
}





奥普瓯江 发表于 2020-1-14 12:03:19

奥普瓯江 发表于 2020-1-14 12:01
溢出什么的我都已经调整了但是还会出现数值变动

还有一个情况我这是把数字储存在了字符串中是不是这个影响到了呢?

人造人 发表于 2020-1-14 14:00:53

奥普瓯江 发表于 2020-1-14 12:03
还有一个情况我这是把数字储存在了字符串中是不是这个影响到了呢?

记住,要贴结果,你期望的运行结果和现在的运行结果
我一再强调要贴结果,我需要这个结果,这会非常有利于我调试

人造人 发表于 2020-1-14 14:02:20

因为我可以直接 b 到那个输出不对的位置,而不是一行一行的跟踪,这太没效率了

人造人 发表于 2020-1-14 14:30:47

奥普瓯江 发表于 2020-1-14 12:03
还有一个情况我这是把数字储存在了字符串中是不是这个影响到了呢?

数组越界访问

#include <stdio.h>

int main()
{
        char str1[] = "ababaaababa";
        char str2;
        int next;
        int i = 1, j = 0;
        str2 = sizeof(str1);                // str2 = 12


        while(i < str2)
        {
                str2 = str1;
                //printf("%d\n", sizeof(str2));
                i++;
        }

        i = 1;
        j = 0;
        next = 0;

        while(i < str2)                // 当 i = 11 时, 11 < 12,执行循环体
        {
                if(0 == j || str2 == str2)
                {
                        i++;                // 执行完 i = 12
                        j++;
                        next = j;        // next = j;        你明白了吧?
                }
                else
                {
                        j = next;
                }
        }

        i = 1;
        printf("%d ", str2);
        while(i < 12)
        {
                printf("%d %d\n", i, next);
                i++;
        }
}

人造人 发表于 2020-1-14 14:31:30

自己调试一下

奥普瓯江 发表于 2020-1-14 16:51:59

人造人 发表于 2020-1-14 14:31
自己调试一下

好的谢谢我调试一下

奥普瓯江 发表于 2020-1-14 18:17:40

人造人 发表于 2020-1-14 14:31
自己调试一下

我调试了一下明白了我错在那里了,下面是我改后的代码和执行后的结果
#include <stdio.h>

int main()
{
        char str1[] = "ababaaababa";
        char str2;
        int next;   //这里之定义了12个数组0-11的下标
        int i = 1, j = 0;
        str2 = sizeof(str1);

       
        while (i < str2)
        {
                str2 = str1;               
                i++;
        }

        i = 1;
        j = 0;
        next = 0;

        while (i < str2)
        {
                if(0 == j || str2 == str2)
                {
                        //printf("!!!!!!!!%c \n",str2 );
                        //printf("****%d\n", i);
                       
                        i++;
                        j++;
                        if (i == 12)    //加了一个if语句防止溢出
                        {
                                break;
                        }
                        next = j;   //next数组我一共定义了下标,他们的下标方式应该是从0-11但是我前面有i++所以当i = 11时到达该位置是12下标如果是12的话也就是13个数组0-12下标所以产生了溢出谢谢啊
                }
                else
                {
                        j = next;
                }
        }

        i = 1;
        //printf("%d ", str2);
        while (i < str2)
        {
                printf("%d %d\n", i, next);
                i++;
        }
        return 0;
}

页: [1] 2
查看完整版本: 为什么一个字符串同一个下表两次引用数据不一样?求next数组