2015-03-25 26 views
-2

基本上我建立一个港口扫描器的种类(技术上它背驮着另一个端口,罐头,但多数民众赞成并不重要)。问题在于用户输入要扫描的目标IP地址的代码。 程序运行平稳,直到用户输入IP地址后返回'分段错误:11'错误。c编程诠释变量与多个'。's

我已经做了一些关于分段错误的研究,我相信这个特殊的错误是由于我的代码已经声明targetIP变量是一个字符,但包含多个'。'的数字,因为您需要一个IP地址。

所以我的问题是,我需要什么样的变量类型可以处理多个'。's?例如: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); 
+8

显示读取IP和相关变量声明的代码部分。'char'肯定是错误的,如果有的话,它应该是'char []'。 – PMF 2015-03-25 08:18:16

+2

包含“多个点”的char []应该没有任何问题。修改你的代码。 – Matt 2015-03-25 08:18:25

+0

您可以使用char *来存储字符,并将字符串转换为不包含''的int类型的'struct'。' – James 2015-03-25 08:27:52

回答

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); 
} 
+0

谢谢@itchee,虽然有很多很好的答案,但对于像我这样的新人来说,这绝对是最简单最容易使用的。 – user4493605 2015-03-25 10:01:03

0

保存你输入一个字符串,并使用分隔符为使用的strtok() 然后将其存储在字符数组或4个不同的字符变量

0

如果您在POSIX工作(或者甚至是Windows)环境。您可以使用:inet_addr

这两个函数返回适用于IPv4的一个不会忽略整数类型。在实践中,您应该使用类型为in_addr的变量,其中包含正确类型的名为s_addr(在窗口下的S_addr)的成员。

但是,请注意,它只适用于IPv4。按照情况,您最好还是准备IPv6地址(并且这些地址不会被.分开)。

1

当前的POSIX标准允许scanf为变量进行内存分配。注意额外的&来更改变量。

char *target_IP; 
scanf("%ms", &target_IP); 

否则,你需要做的

char target_IP[200]; 
scanf("%s", target_IP); 

,仍然冒险恶意缓冲区溢出。

0

我遇到的问题是target_IP本身。
您声明target_IP作为字符指针并且无处分配内存给字符指针。然后,您正在尝试向未分配的内存位置写入值,这肯定会导致分段错误。

所以首先分配内存到target_IP然后像你一样使用它。

target_IP = malloc(16); 
scanf("%s", target_IP);