netmask转换,有什么不对?

时间:2016-11-25 13:08:04

标签: c arrays loops strtok

有人可以告诉我下面的代码出错了吗?

#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");
    }
}

这似乎是一个无限循环。

3 个答案:

答案 0 :(得分:1)

问题是,像

这样的定义
char b[15]="255.255.255.255";

你错过了null-terminator,所以技术上b不是字符串,并且将它作为字符串处理函数的参数传递将调用undefined behavior,作为函数将超过分配的内存以搜索字符串的结尾。

为了更好,请将大小分配保留给编译器,如

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

或者,如果您必须自己提供大小,请记住在计算中包含null-terminator,例如

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

所有需要用作字符串的数组都是如此。

注意:请停止使用令人困惑的变量名称。

  func(a,b);

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

没有任何有意义的目的,除了令人困惑的人(包括你,稍后)

答案 1 :(得分:1)

问题在于以下代码中的null-terminator。

char b[15]="255.255.255.255";大小应为16

同样char a[8]={0};大小应为9或代替strcat(a,b),您可以使用以下内容:

strncat(b, a, 8);但我建议你使用null-terminator。

答案 2 :(得分:0)

上述计划中几乎没有问题: -

  1. 无论何时使用char数组,都需要考虑Null。所以将str [35]改为str [36],b [15]改为b [16],b [35]改为b [36],a [8]改为a [9]。
  2. 将条件从if(i!= 3)改变为if(i <= 3)。
  3. 程序应该开始工作。这个对我有用。我可以看到二进制转换的网络掩码。