2016-11-25 28 views
1

有人可以告訴我哪裏出錯了以下代碼?netmask轉換,有什麼錯?

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

int main() { 
    char str[35]={0}; 
    char b[15]="255.255.255.255"; 
    nmcalc(b,str); 
    return 0; 
} 

void nmcalc(char str[],char b[35]) { 
    char *delim = "."; 
    char *pch; 
    char a[8]={0}; 
    int num; 
    int i =0; 

    pch = strtok(str,delim); 
    while (pch != NULL){ 
    i++; 
    num=atoi(pch); 
    decToBinStr8bit(num,a); 
    strcat(b,a); 
    if(i!=3){ 
     strcat(b,"."); 
    } 
    pch = strtok(NULL, delim); 
    }  
} 

void decToBinStr8bit(int n,char str[]){ 
    int c, k; 
    strcpy(str,""); 
    for (c = 7; c >= 0; c--) { 
     k = n >> c; 

      if (k & 1) 
       strcat(str,"1"); 
     else 
       strcat(str,"0"); 
    } 
} 

這似乎是一個無限循環。

+0

請注意,您應該在'main'函數之前定義'nmcalc'和'decToBinStr8bit' – Valeriy

回答

1

的問題是,與像你錯過了空終止

char b[15]="255.255.255.255"; 

的定義,所以在技術上b不是,並通過它作爲字符串處理函數的參數會調用undefined behavior,因爲函數將通過分配的內存來搜索字符串的末尾。

爲了更好的,離開了大小分配到編譯器,像

char b[ ]="255.255.255.255"; // array incldes the null-terminator. 

,或者,如果你自己提供的尺寸,請記住,包括空終止的計算,像

#define ARRSIZ 16 
    char b[ARRSIZ]="255.255.255.255"; 

對於所有需要使用的陣列字符串也是如此。


注意:請停止使用易混淆的變量名稱。

func(a,b); 

    int func(int b, int a) {.... 

不提供其他的是迷惑人的任何有意義的目的(包括你,在一段時間後)

+1

同樣'a'和'str'沒有足夠的空間來保存帶有NUL終止符的結果。 – Arkku

1

問題出在以下代碼中的空終止符。

char b[15]="255.255.255.255";尺寸應該是16

而且char a[8]={0};大小應9或代替strcat(a,b)您可以使用以下方法:

strncat(b, a, 8);但我建議你使用空終止符。

0

有在上面的程序幾個問題: -

  1. 你需要考慮空當你正在使用的字符數組。因此,將str [35]改爲str [36],b [15]改爲b [16],b [35]改爲b [36],a [8]改爲[9]。
  2. 將條件從if(i!= 3)更改爲if(i < = 3)。

程序應該開始工作。這個對我有用。我可以看到二進制轉換後的網絡掩碼。

相關問題