想要获取由不同字符串长度给出的数据量

时间:2014-03-11 08:06:49

标签: c string strlen

我使用'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;
}

3 个答案:

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