-3

我知道这对你们大多数人来说非常简单,但我试图在循环中将 IP 地址增加 +1。

例子:

for(double ip = 1.1.1.1; ip < 1.1.1.5; ip++)
{
printf("%f", ip);
}

基本上我要做的就是在for循环中将ip增加+1。我不知道将 ip 存储在什么类型的变量中,也不知道如何增加它。每当我运行程序时,我都会收到一条错误消息,指出该数字的小数点太多。我还在互联网上看到您必须将 ip 存储在字符数组中,但您不能增加字符数组(我知道)。我应该将ip存储在什么变量类型中/我应该如何处理这个?谢谢你。

4

3 回答 3

2

一个幼稚的实现(否inet_pton)将使用 4 个数字并将它们打印到一个char数组中

#include <stdio.h>

int inc_ip(int * val) {
    if (*val == 255) {
        (*val) = 0;
        return 1;
    }
    else {
        (*val)++;
        return 0;
    }
}   

int main() {
    int ip[4] = {0};
    char buf[16] = {0};

    while (ip[3] < 255) {
        int place = 0;
        while(place < 4 && inc_ip(&ip[place])) {
            place++;
        }
        snprintf(buf, 16, "%d.%d.%d.%d", ip[3],ip[2],ip[1],ip[0]);
        printf("%s\n", buf);
    }
}

*编辑:一个受alk启发的新实现

struct ip_parts {
    uint8_t vals[4];
};

union ip {
    uint32_t val;
    struct ip_parts parts;
};

int main() {
    union ip ip = {0};
    char buf[16] = {0};

    while (ip.parts.vals[3] < 255) {
        ip.val++;
        snprintf(buf, 16, "%d.%d.%d.%d", ip.parts.vals[3],ip.parts.vals[2],
                                        ip.parts.vals[1],ip.parts.vals[0]);
        printf("%s\n", buf);
    }
}
于 2013-08-15T16:49:14.917 回答
1

IPV4 地址为 32 位宽。

为什么不采用 32 位宽的无符号整数(uint32_t例如)将其初始化为任何起始值,对其进行计数并使用适当的 libc 函数将结果转换为 ip-address 的点分字符串版本?

有关后者的进一步参考,请参阅inet_XtoY()函数系列的手册页。

于 2013-08-15T16:54:11.313 回答
0

如果您正在搜索相同的子网 1.1.1。您可以将最后一个八位字节存储为唯一 int 的整个时间。

int lastoctet = 1;

循环遍历它,每次都增加 lastoctet 并将其附加到您的字符串中。

我不熟悉 C 语法,所以

//Declare and set int lastoctet = 1
//set ipstring, string ipstring = "1.1.1."
//Loop and each time increase lastoctet
   //ipstring = ipstring & lastoctet.tostring
   //perform actions
   //lastoctet++
//end loop

如果您正在搜索更多八位字节或需要增加其他数字,您可以将该八位字节存储为一个单独的整数,并在循环之前或期间重新调整您的字符串。

于 2013-08-15T16:40:40.320 回答