根据c中的输入拆分二进制数字序列

时间:2018-09-16 21:53:53

标签: c arrays

我有一个代表地址的二进制数字数组。我现在想将此地址分为tagindexoffset 3个部分或数组,这三个部分的位数由用户确定。 为了更清楚,这是代码:

char* bin_val_addr;
while(fscanf(FP, "%s %lx", str, &addr) != EOF)
{

    bin_val_addr = long_to_binary(addr);

    char* array_Tag = malloc(no_Tag_bits * sizeof(char*));
    char* array_Index = malloc(no_Index_bits * sizeof(char*));
    memcpy(array_Tag, bin_val_addr, no_Tag_bits * sizeof(char*));
    memcpy(array_Index, bin_val_addr, no_Index_bits * sizeof(char*));
    printf("TAG array is: %s\n", array_Tag);
    printf("INDEX array is: %s\n", array_Index);


}

函数long_to_binary如下:

char* long_to_binary(unsigned long k)
{
        static char c[65];
        c[0] = '\0';

        unsigned long val;
        for (val = 1UL << (sizeof(unsigned long)*8-1); val > 0; val >>= 1) 
        {        
            strcat(c, ((k & val) == val) ? "1" : "0");
        }
        return c;
}

我查看了拆分数组的方法,发现可以使用memcpy,但是在实现此方法时我出错了。有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

如果bin_val_addr1s0stag的顺序包含indexoffset的序列,则从bin_val_addrarray_Tag的{​​{1}}的开始,例如

array_Index

如果 memcpy(array_Tag, bin_val_addr, no_Tag_bits * sizeof(char*)); memcpy(array_Index, bin_val_addr, no_Index_bits * sizeof(char*)); array_Index中{strong>之后 array_Tag开始,那么您需要将bin_val_addr的源偏移array_Index

(请注意,您是在混合比特和字节(字符no_Tag_bits'1'而不是比特)。因此,除非每个字符需要 8字节'0'应该为sizeof(char*)-始终为sizeof(char),并应从您的分配中删除)

例如,分配以保留每个数组中指定的字符(对于 nul-termination 字符为1),您可以执行以下操作:

+1

,并且您必须验证每个分配,因为 char *array_Tag = malloc(no_Tag_bits + 1); char *array_Index = malloc(no_Index_bits + 1); 可能并且将因内存耗尽而返回malloc失败,例如

NULL

将这些片段放在一起并每个字符串 nul-终止,您将拥有:

    if (!array_Tag) {
        perror ("malloc-array_Tag");
        exit (EXIT_FAILURE);
    }

现在允许您将数组输出为 strings

    memcpy (array_Tag, bin_val_addr, no_Tag_bits);
    array_Tag[no_Tag_bits] = 0;
    memcpy (array_Index, bin_val_addr + no_Tag_bits, no_Index_bits);
    array_Index[no_Index_bits] = 0;

最后,您在{em> matching 或 input 失败时使用 printf ("TAG array is: %s\n", array_Tag); printf ("INDEX array is: %s\n", array_Index); 会引发未定义行为,但失败总数少于指定的转换发生。而不是对照fscanf进行检查,您应该使用实际指定的转化次数进行验证,例如

EOF

进行了这些更改之后,假设您的while (fscanf (FP, "%s %lx", str, &addr) == 2) 可以按预期工作,请告诉我是否还有其他问题。