user-0 提问: 【C语言求助】为什么这个代码会进入死循环？

回复:
user: user-1
content: C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 放在while(*p!=0)循环里面，循环条件是*p!=0，也就是只有*p=0时才能退出，在循环体里这个条件始终是满足的，最后p++跑出数组的范围了。

user: user-0
content: 引用 1 楼 qzjhjxj的回复:供参考：#include<stdio.h>  void main() {      int people[1000],n;     printf("Please enter the number of people:\n");     scanf("%d",&n);     //给n个人按顺序编号      for(int i=0;i<n;i++)     {         people[i]=i+1;     }          int *p=people;     int remain=n,num_off=1; //num_off是循环过程中该人在1~3中报的数     while(remain>1) //剩下的人数大于1     {         p=people;                  while(p!=(people+n-1))//剩下的人不是编号最后一个         {            //printf("p=%d\n",*p);                          while(*p!=0)             {                  if(num_off!=3)                 {                      num_off++;                     //p++;                 }                 else if(num_off==3)                 {                      *p=0;  //如果报数为3则剔除该人，用赋值0来达到此效果                     remain--; //剔除后剩余人数减1                     //p++;                     num_off=1; //报数开始新的一轮 1 2 3 1 2 3.。。                 }             }             p++;         }     }     printf("打印此段话说明循环结束");      } 还有就是，为什么把p＋＋；跟while(*p！＝5)并列以后，while会循环3次？

user: user-3
content: 楼主的代码每次都从头开始数数，与常见的不同啊。请楼主确认一下，题目确实是这样的？

user: user-4
content: 注意下数组不要越界，因此再输入n之后要对n的值进行判断，处理。

user: user-0
content: 引用 5 楼 qzjhjxj的回复:仔细分析楼主的代码，里面用while(*p!=0)来判断*P==0这里是错误的，*p表示的是数组里某一位的值，这里应用if，逻辑判断设计问题，修正如下，供参考：#include<stdio.h>  void main() {      int people[1000],n;     printf("Please enter the number of people:\n");     scanf("%d",&n);     //给n个人按顺序编号      for(int i=0;i<n;i++)     {         people[i]=i+1;     }          int *p=people;     int remain=n,num_off=1; //num_off是循环过程中该人在1~3中报的数     while(remain>1) //剩下的人数大于1     {         p=people;                  while(p!=(people+n-1))//剩下的人不是编号最后一个         {            //printf("p=%d\n",*p);              if(*p!=0 )  //while(*p!=0)             {                      //if(num_off!=3)                      num_off++;                  //  p++;             }                 //else                 if(num_off==3)                 {                      *p=0;  //如果报数为3则剔除该人，用赋值0来达到此效果                     remain--; //剔除后剩余人数减1                     //p++;                     num_off=1; //报数开始新的一轮 1 2 3 1 2 3.。。                  }             //}             p++;         }     }     printf("打印此段话说明循环结束");      } 好，我再看看，谢谢

user: user-2
content: 仔细分析楼主的代码，里面用while(*p!=0)来判断*P==0这里是错误的，*p表示的是数组里某一位的值，这里应用if，逻辑判断设计问题，修正如下，供参考：#include<stdio.h>  void main() {      int people[1000],n;     printf("Please enter the number of people:\n");     scanf("%d",&n);     //给n个人按顺序编号      for(int i=0;i<n;i++)     {         people[i]=i+1;     }          int *p=people;     int remain=n,num_off=1; //num_off是循环过程中该人在1~3中报的数     while(remain>1) //剩下的人数大于1     {         p=people;                  while(p!=(people+n-1))//剩下的人不是编号最后一个         {            //printf("p=%d\n",*p);              if(*p!=0 )  //while(*p!=0)             {                      //if(num_off!=3)                      num_off++;                  //  p++;             }                 //else                 if(num_off==3)                 {                      *p=0;  //如果报数为3则剔除该人，用赋值0来达到此效果                     remain--; //剔除后剩余人数减1                     //p++;                     num_off=1; //报数开始新的一轮 1 2 3 1 2 3.。。                  }             //}             p++;         }     }     printf("打印此段话说明循环结束");      }

user: user-0
content: 引用 5 楼 qzjhjxj的回复:仔细分析楼主的代码，里面用while(*p!=0)来判断*P==0这里是错误的，*p表示的是数组里某一位的值，这里应用if，逻辑判断设计问题，修正如下，供参考：#include<stdio.h>  void main() {      int people[1000],n;     printf("Please enter the number of people:\n");     scanf("%d",&n);     //给n个人按顺序编号      for(int i=0;i<n;i++)     {         people[i]=i+1;     }          int *p=people;     int remain=n,num_off=1; //num_off是循环过程中该人在1~3中报的数     while(remain>1) //剩下的人数大于1     {         p=people;                  while(p!=(people+n-1))//剩下的人不是编号最后一个         {            //printf("p=%d\n",*p);              if(*p!=0 )  //while(*p!=0)             {                      //if(num_off!=3)                      num_off++;                  //  p++;             }                 //else                 if(num_off==3)                 {                      *p=0;  //如果报数为3则剔除该人，用赋值0来达到此效果                     remain--; //剔除后剩余人数减1                     //p++;                     num_off=1; //报数开始新的一轮 1 2 3 1 2 3.。。                  }             //}             p++;         }     }     printf("打印此段话说明循环结束");      } 我又开了一个帖子，里面是完整的代码，麻烦帮忙看看

user: user-0
content: 引用 7 楼 自信男孩的回复:注意下数组不要越界，因此再输入n之后要对n的值进行判断，处理。 我又开了一个帖子，里面是完整的代码，麻烦帮忙看看

user: user-0
content: 引用 8 楼 forever74的回复:楼主的代码每次都从头开始数数，与常见的不同啊。请楼主确认一下，题目确实是这样的？ 我又开了一个帖子，里面是完整的代码，麻烦帮忙看看

user: user-0
content: 引用 1 楼 qzjhjxj的回复:供参考：#include<stdio.h>  void main() {      int people[1000],n;     printf("Please enter the number of people:\n");     scanf("%d",&n);     //给n个人按顺序编号      for(int i=0;i<n;i++)     {         people[i]=i+1;     }          int *p=people;     int remain=n,num_off=1; //num_off是循环过程中该人在1~3中报的数     while(remain>1) //剩下的人数大于1     {         p=people;                  while(p!=(people+n-1))//剩下的人不是编号最后一个         {            //printf("p=%d\n",*p);                          while(*p!=0)             {                  if(num_off!=3)                 {                      num_off++;                     //p++;                 }                 else if(num_off==3)                 {                      *p=0;  //如果报数为3则剔除该人，用赋值0来达到此效果                     remain--; //剔除后剩余人数减1                     //p++;                     num_off=1; //报数开始新的一轮 1 2 3 1 2 3.。。                 }             }             p++;         }     }     printf("打印此段话说明循环结束");      } 请问为什么p＋＋；放在while循环里面会无限循环啊？难道说while里面的p＋＋；影响不了while循环条件里的*p的值吗？

user: user-2
content: 供参考：#include<stdio.h>  void main() {      int people[1000],n;     printf("Please enter the number of people:\n");     scanf("%d",&n);     //给n个人按顺序编号      for(int i=0;i<n;i++)     {         people[i]=i+1;     }          int *p=people;     int remain=n,num_off=1; //num_off是循环过程中该人在1~3中报的数     while(remain>1) //剩下的人数大于1     {         p=people;                  while(p!=(people+n-1))//剩下的人不是编号最后一个         {            //printf("p=%d\n",*p);                          while(*p!=0)             {                  if(num_off!=3)                 {                      num_off++;                     //p++;                 }                 else if(num_off==3)                 {                      *p=0;  //如果报数为3则剔除该人，用赋值0来达到此效果                     remain--; //剔除后剩余人数减1                     //p++;                     num_off=1; //报数开始新的一轮 1 2 3 1 2 3.。。                 }             }             p++;         }     }     printf("打印此段话说明循环结束");      }