2016-11-25 42 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)。

程序应该开始工作。这个对我有用。我可以看到二进制转换后的网络掩码。

相关问题