c用多个'。'编程int变量

时间:2015-03-25 08:15:15

标签: c

基本上我正在构建各种端口扫描器(从技术上来说,它背负着另一个端口 - 罐头,但这并不重要)。问题在于用户输入要扫描的目标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);

5 个答案:

答案 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);