2017-05-10 70 views
0

我有任務讓c程序輕鬆檢查IP地址的類別。我的問題是我不在c中工作,我不知道我的程序有什麼問題,因爲我沒有任何IDE,並且所有的東西都在Debian上編譯。簡單的程序檢查ip - scanf分段錯誤

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int ip[4]; 
    int i=0; 

    printf("Enter IP address: "); 

    for(i=0;i<4;i++) { 
     printf("%d: ",i); 
     scanf("%s",ip[i]); 
    } 

    printf("Your IP address: %03d.%03d.%03d.%03d\n",ip[0],ip[1],ip[2],ip[3]); 

    if(ip[0]>=0 && ip[0]<=127){ 
     printf("This is class A IP address\n"); 
     printf("Network address: %03d.0.0.0",ip[0]); 
    } 
    if(ip[0]>127 && ip[0]<=191){ 
     printf("This is class B IP address\n"); 
     printf("Network address: %03d.%03d.0.0",ip[0],ip[1]); 
    } 
    if(ip[0]>191 && ip[0]<224){ 
     printf("This is class C IP address\n"); 
     printf("Network address: %03d.%03d.%03d.0",ip[0],ip[1],ip[2]); 
    } 

    return 1; 
    } 

當我有這樣的代碼有段故障,並當第18行我做了

scanf("%s",&ip[i]); 

我沒有任何錯誤,但我的數字是隨機的。

+0

change'scanf(「%s」,&ip [i]);'to'scanf(「%d」,&ip [i]);'。 ip是int數組,而ip [i]是int類型的。 「%s」用於讀取字符串/字符數組,而%d用於int –

+0

我didn.t知道beetwen%s和%d有差異,我認爲這個參數不能重複發生......謝謝 –

回答

1

scanf需要一個指向存儲結果的內存的指針。你沒有傳遞一個指針。你傳遞一個數組值。

除此之外,您正試圖掃描一個字符串(又名%s)爲一個整型變量。要掃描的整數使用%d

因此改變

scanf("%s",ip[i]); 

scanf("%d", &ip[i]); 

最後,您應經常檢查值由scanf返回,以確保你有物品的正確數量,即

if (scanf("%d", &ip[i]) != 1) 
{ 
    // Illegal input. 
    // Add error handling, e.g. just terminate 
    exit(1); 
} 
1

換行:

scanf("%s",ip[i]); 

到:

scanf("%d", &ip[i]); //%d instead of %s 

爲:

  • 符號&是必要的,以便通過一個指針scanf
  • 您想閱讀int s,所以正確的說明符是%d%s用於字符串。