有人可以告诉我下面的代码出错了吗?
#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 :(得分: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)
上述计划中几乎没有问题: -
程序应该开始工作。这个对我有用。我可以看到二进制转换的网络掩码。