2015-03-25 47 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);