十进制到二进制转换不起作用

时间:2012-11-07 06:19:23

标签: c

#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"

4 个答案:

答案 0 :(得分:1)

该行:

long int fractionfactor = .1;

会将fractionfactor设置为0,因为该变量定义为整数。请尝试使用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

除非您以不寻常的方式使用该语言,否则只需将代码翻译成英语即可。您可以假设读者熟悉该语言;相反,解释你的推理会更有帮助。

答案 1 :(得分:0)

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

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

字符串比较功能的结果应该被否定,以便您可以继续。否则它将打印无效参数。因为strcmp在字符串相等时返回'0'。

在'decimal2binary'函数中,您在函数内为输入参数'decimal'分配一个新的内存块,

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

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

答案 2 :(得分:0)

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

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

long int dec = myatoi(decimal);

将新分配的内存中的(随机值)分配给dec

所以删除行

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

你会得到正确答案。

答案 3 :(得分: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);
}