【问题标题】:Finding all the possible IP addresses, running into infinite loop查找所有可能的 IP 地址,陷入无限循环
【发布时间】:2020-06-09 12:55:40
【问题描述】:

这是一个问题,您必须输入一个非零位数字,然后程序会将其转换为具有 4 个部分且每个部分小于 255 的 IP 地址,并且必须打印所有 IP 地址。
我已经尝试过这种递归方法,并且正在陷入无限循环。

#include<stdio.h>
#include<math.h>
int a[3];
void comuni(unsigned long n,int count){
    int i=count;
    do{
        if(count<0){
            return;
        }
        int t=pow(10,i);
        a[count]=n/t;
        int rem=n%t;
        if(a[count]<=255 &&a[count]>0 && count>=0){
            printf("%d.",a[count]);
            comuni(rem,count-1);
        }    
        i++;
    }while(1);
}

int main()
{
    //  Insert your code here.
    unsigned long n;
    scanf("%ul",&n);
    comuni(n,3);
    return 0;
}

【问题讨论】:

  • 所有IP地址是什么意思?能举个例子吗?
  • 为什么要除以 10?如果这些是 IP 地址的一部分,则应除以 256。
  • int a[3]; 创建一个数组,其空间足够容纳 三个 值:a[0]a[1]a[2]。您尝试访问不存在的a[3]
  • Ayush Gupta,请告诉我如何让我的回答对您更有帮助。

标签: c loops recursion


【解决方案1】:

你的问题是为什么会有一个无限循环。

while(1) 开始,我并不感到惊讶。
但是等等,里面有一个return,如果count小于0,就会用到它。
循环内没有任何变化count。因此,如果 count 大于或等于 0 开始,您将获得无限循环。

我认为导致这种情况的问题是这个

int i=count;

当您更改 i 时不会导致 count 更改。
您确实在循环内更改了 i,但您知道 - 它没有帮助。

【讨论】:

  • 我想悬赏一下在任何情况下都提倡使用while(1)的老师......
  • 嵌入式实时系统使用怎么样?
  • @ChristianGibbons 那是我的交易。以几十年为单位的预期正常运行时间。我考虑过提一下。但你是对的。正是在那种环境下,我看到一位while(1) 工作了不到 19 年。任何规则都有例外。但是看着这么新手的问题,没有任何借口。我应该提到那个循环,那么至少有礼貌不包含任何breakreturn?当我写 while(1) 时,我是认真的。
  • 主循环是否有传统的替代方案?我的嵌入式经验是在我大学时代开始的,我们大部分时间都留给自己的设备来弄清楚如何实施通常与 MCU 寄存器和 IO 等相关的特定主题之外的项目。
  • @ChristianGibbons 请记住,内部没有breakreturnwhile(1) 循环对我来说很好。如果您真的是指无限循环,那么就可以这样编程。但是对于“永远循环,直到宇宙终结,除非在中间的某个地方我改变主意”,任何程序员都应该得到他们收获的所有调试必要性......
猜你喜欢
  • 2020-06-09
  • 2020-05-13
  • 2019-03-03
  • 1970-01-01
  • 2018-12-01
  • 2013-03-17
相关资源
最近更新 更多