我知道这对你们大多数人来说非常简单,但我试图在循环中将ip地址增加+1。
示例:
for(double ip = 1.1.1.1; ip < 1.1.1.5; ip++)
{
printf("%f", ip);
}
基本上我所要做的就是在for循环中将ip增加+1。 我不知道存储ip的变量类型,也不知道如何增加它。 每当我运行程序时,我都会收到错误消息,说明该数字的小数点太多。 我还在互联网上看到你必须在一个字符数组中存储ip,但是你不能增加一个字符数组(我知道)。 我应该在什么变量类型中存储ip /我该如何处理?谢谢。
答案 0 :(得分: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);
}
}
答案 1 :(得分: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
如果您正在搜索更多八位字节或需要增加其他数字,您可以将该八位字节存储为单独的整数,并在循环之前或期间重新设置字符串。
答案 2 :(得分:0)
IPV4地址为32位宽。
为什么不采用32位宽的无符号整数(例如uint32_t
)将其初始化为任何起始值,将其计数并使用适当的libc函数将结果转换为ip-address的虚线字符串版本?
有关后者的进一步参考,请参阅inet_XtoY()
函数族的手册页。