我使用'strlen'来查找字符串的长度,将其称为字符串a。然后我做了一些其他事情来创建二进制字符串。二进制字符串值比字符串a长。我希望返回二进制字符串,只要字符串a。我该怎么办? 让我尝试编写代码以帮助澄清:
int main(int argc, char** argv)
{
int i, j, k, l, prefix_length, sum;
char *s, *dot, *binary_string, *ret_val, *temp_string;
char buf[] = "10.29.246.49/32";
s = strtok(buf, "/");
prefix_length = strlen(s);
for(i = 4; i > 0; i--){
dot = strtok(s, ".");
while (dot != NULL){
j = atoi(dot);
sum = sum + j;
s = strtok(NULL, ".");
}
*binary_string = dec_to_bin(sum);
}
strcpy(temp_string, "0");
for(l = prefix_length - strlen(binary_string); i > 0; i--){
strcat(temp_string, binary_string);
strcpy(binary_string, temp_string);
strcpy(tempstring, "0");
}
ret_val = binary_string;
return 0;
}
另外,你能看看我的dec_to_bin并告诉我,我是否正确地说你有什么:
char dec_to_bin(int decimal)
{
char *ret;
int d = decimal, i;
for (i = 128; i >= 1; i = i/2){
if(d / i){
ret += '1';
d -= i;
}
else
ret += '0';
}
return *ret;
}
答案 0 :(得分:1)
如果binary_string是一个std :: string,它需要用于binary_string + =才能工作,那么
std::string return_val = binary_string.substr(0, strlen(a));
如果你只限于char *那么
int l = strlen(a);
char* return_val = new char[l + 1];
strncpy(return_val, binary_string, l);
return_val[l] = 0;
答案 1 :(得分:1)
您的dec_to_bin正在尝试将数字转换为' 1' 0' 0,但只返回第一个字符值
您将ret定义为char *指针,但您使用它就像std :: string一样。它是一个指向内存的指针,你必须为它提供一些指向的内存。因为它是覆盖随机内存,虽然在调试模式下ret可能初始化为0,所以你只会得到一个内存异常。
您可以使用malloc分配内存,但这会导致一个痛苦的世界,因为您调用该函数的方式只会导致内存泄漏。
如果你必须使用char *指针而不是std :: string,那么我建议传递一个缓冲区来写入字符串。你知道字符串总是8个字符加上空终止符
char buffer[9];
dec_to_bin(sum, buffer);
ret + =' 1'没有做你认为它做的事情。它正在为char *指针添加一个char值,这是完全不同的。您需要将字符存储在ret指向的位置,然后将ret移动到指向下一个位置
*ret = '1';
ret = ret + 1;
或
*ret++ = '1';
当此完成时,ret将指向字符串的结尾,因此您无法返回该字符串。返回传递给例程的值没有多大好处,但如果必须,则需要保存它
char* dec_to_bin(int decimal, char *buffer)
{
char *ret = buffer;
int d = decimal, i;
for (i = 128; i >= 1; i = i/2){
if(d / i){
*ret++ = '1';
d -= i;
}
else
*ret++ = '0';
}
return buffer;
}
您应该在调试器中运行此程序,因为这将教会您很多关于代码中实际发生的事情
答案 2 :(得分:0)
仅在第一次调用strtok()时指定变量名。对于相同字符串的操作,请再次使用strtok()as,
strtok(NULL,".");
了解使用strtok()阅读此link 要获取所需的二进制字符串,可以按照以下步骤进行操作
for(i = 4; i > 0; i--){
dot = strtok(s, ".");
if (dot != NULL){
j = atoi(dot);
sum=sum+j;
s = strok(NULL, ".");
}
else{
k = atoi(s);
sum=sum+j;
}
//printf("%s\n", dot);
}
binarystring=dec2bin(sum);
你可以减少这个循环并使用,
dot = strtok(s, ".");
while (dot != NULL)
{
j = atoi(dot);
sum=sum+j;
s = strok(NULL, ".");
}
binarystring=dec2bin(sum);
这里不是添加二进制数,而是添加整数,然后将总和转换为二进制。结果将是相同的数字right.dec2bin()应将十进制转换为二进制并返回二进制数字作为字符串。然后添加类似于此的代码,使binary_string长度与a的长度相同,
strcpy(tempstring,"0");
for(i=strlen(a)-strlen(binary_string);i>0;i--)
{
strcat(tempstring,binary_string);
strcpy(binary_string,tempstring);
strcpy(tempstring,"0");
}