基本上我正在构建各种端口扫描器(从技术上来说,它背负着另一个端口 - 罐头,但这并不重要)。问题在于用户输入要扫描的目标IP地址的代码。 程序运行平稳,直到用户输入IP地址后返回“分段错误:11”错误。
我已经对分段错误做了一些研究,我相信这个特殊的错误是因为我的代码已将targetIP
变量声明为char,但包含多个'。'的数字。需要一个IP地址。
所以我的问题是,我需要哪种变量类型可以处理多个'。'的数字?例如:225.1.1.24
代码:
char *target_IP;
scanf("%s",target_IP);
// segmentation fault occurs here so bellow printf is never displayed vv
printf("\nWriting target IP [%s] to file\n",target_IP);
答案 0 :(得分:1)
当前的POSIX标准允许scanf对变量进行内存分配。注意额外的&
来更改变量。
char *target_IP;
scanf("%ms", &target_IP);
否则你需要做
char target_IP[200];
scanf("%s", target_IP);
仍然存在恶意缓冲区溢出的风险。
答案 1 :(得分:0)
将输入保存在字符串中,并使用分隔符作为“。”使用strtok()。 然后将它存储在char数组或4个不同的char变量
中答案 2 :(得分:0)
看一下这个例子:
#include <stdio.h>
int main() {
int part1, part2, part3, part4;
printf("Enter IP (e.g. 127.0.0.1): ");
scanf("%d.%d.%d.%d", &part1, &part2, &part3, &part4);
printf("IP is %d - %d - %d - %d\r\n", part1, part2, part3, part4);
}
答案 3 :(得分:0)
如果您在POSIX(甚至Windows)环境中工作。您可以使用:inet_addr
:
这两个函数都返回适合IPv4地址的整数类型。在实践中,您应该使用类型为in_addr
的变量,该变量包含正确类型的名为s_addr
(Windows下为S_addr
}的成员。
但是,请注意,它仅适用于IPv4。随着时间的推移,您最好也准备好IPv6地址(并且这些地址不会被.
分隔开来。)
答案 4 :(得分:0)
我认为问题出在target_IP
本身
您将target_IP
声明为字符指针,并且无法将内存分配给char指针。然后你试图将值写入未分配的内存位置,这肯定会导致分段错误。
所以首先将内存分配给target_IP,然后像你一样使用它。
target_IP = malloc(16);
scanf("%s", target_IP);