2012-11-07 64 views
0
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int myatoi(const char* string) { 
    int i = 0; 
    while (*string) { 
    i = (i << 3) + (i<<1) + (*string -'0'); 
    string++; 
    } 
    return i; 
} 

void decimal2binary(char *decimal, int *binary) { 
    decimal = malloc(sizeof(char) * 32); 
    long int dec = myatoi(decimal); 
    long int fraction; 
    long int remainder; 
    long int factor = 1; 
    long int fractionfactor = .1; 
    long int wholenum; 
    long int bin; 
    long int onechecker; 
    wholenum = (int) dec; 
    fraction = dec - wholenum; 

    while (wholenum != 0) { 
    remainder = wholenum % 2; // get remainder 
    bin = bin + remainder * factor; // store the binary as you get remainder 
    wholenum /= 2; // divide by 2 
    factor *= 10; // times by 10 so it goes to the next digit 
    } 
    long int binaryfrac = 0; 
    int i; 
    for (i = 0; i < 10; i++) { 
    fraction *= 2; // times by two first 
    onechecker = fraction; // onechecker is for checking if greater than one 
    binaryfrac += fractionfactor * onechecker; // store into binary as you go 
    if (onechecker == 1) { 
     fraction -= onechecker; // if greater than 1 subtract the 1 
    } 
    fractionfactor /= 10; 
    } 

    bin += binaryfrac; 
    *binary = bin; 
    free(decimal); 
} 

int main(int argc, char **argv) { 
    char *data; 
    data = malloc(sizeof(char) * 32); 
    int datai = 1; 
    if (argc != 4) { 
    printf("invalid number of arguments\n"); 
    return 1; 
    } 
    if (strcmp(argv[1], "-d")) { 
    if (strcmp(argv[3], "-b")) { 
     decimal2binary(argv[2], &datai); 
     printf("output is : %d" , datai); 
    } else { 
     printf("invalid parameter"); 
    } 
    } else { 
    printf("invalid parameter"); 
    } 
    free(data); 
    return 0; 
} 

在这个问题上,myatoi正常工作和decimal2binary算法是正确的,但我每次运行该代码时它给我的输出为0。我不知道为什么。指针有问题吗?我已经设置了可变数据的地址,但输出仍然不变。十进制转换为二进制转换不工作

./dec2bin "-d" "23" "-b" 
+2

调用这样说:'./dec2bin -d 23 -b',而不是双 - 引用 –

+0

shell将删除引号,因此省略它们将不会有所作为。 –

+0

好哇,我试过它,但我得到了109519692 – Nabmeister

回答

1

线:

long int fractionfactor = .1; 

将设置fractionfactor0因为变量被定义为一个整数。请尝试使用floatdouble代替。

同样,

long int dec = myatoi(decimal); 

存储的整数值,所以wholenum是不必要的。


而不是

i = (i << 3) + (i<<1) + (*string -'0'); 

的代码将更具可读性为

i = i * 10 + (*string - '0'); 

,并与今天的优化编译器,这两个版本可能会产生相同的目标代码。一般来说,特别是当你的代码不工作时,优先考虑优化的可读性。


fraction *= 2; // times by two first 

评论这样,简单地把英文翻译代码,是不必要的,除非你使用的语言在一个不寻常的方式。您可以假设读者熟悉该语言;相反,解释你的推理更有帮助。

0
if(!strcmp(argv[3] , "-b")) 

if(!strcmp(argv[3] , "-d")) 

应该取消字符串比较函数的结果,以便继续。否则它会打印无效的参数。因为strcmp在字符串相等时返回'0'。

在“decimal2binary”功能要为输入参数“小数”在函数内部分配一个新的内存块,

decimal = malloc(sizeof(char) * 32); 

这实际上覆盖您输入的参数数据。

0
void decimal2binary(char *decimal, int *binary) { 
    decimal = malloc(sizeof(char) * 32); 
    ... 
} 

上述代码行分配一个新的内存块到decimal,然后它将不再指向输入数据。然后,线

long int dec = myatoi(decimal); 

新分配的存储器中的(在随机值)分配给dec

所以删除行

decimal = malloc(sizeof(char) * 32); 

,你会得到正确的答案。

0

另一种编码提示:不要写成

if (strcmp(argv[1], "-d")) { 
    if (strcmp(argv[3], "-b")) { 
    decimal2binary(argv[2], &datai); 
    printf("output is : %d" , datai); 
    } else { 
    printf("invalid parameter"); 
    } 
} else { 
    printf("invalid parameter"); 
} 

你可以重构嵌套if块,使他们更简单,更容易理解。一般来说,早期检查错误条件是一个好主意,可以将错误检查与核心处理分开,并尽可能专门地解释错误,以便用户知道如何纠正错误。

如果你这样做,也可能是更容易实现,无论原来的条件,应该被否定:

if (strcmp(argv[1], "-d") != 0) { 
    printf("Error: first parameter must be -d\n"); 
else if (strcmp(argv[3], "-b") != 0) { 
    printf("Error: third parameter must be -b\n"); 
} else { 
    decimal2binary(argv[2], &datai); 
    printf("Output is: %d\n" , datai); 
}