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

4 回答 4

1

该行:

long int fractionfactor = .1;

将设置fractionfactor为,0因为变量被定义为整数。尝试使用floatordouble代替。

相似地,

long int dec = myatoi(decimal);

存储一个整数值,所以wholenum没有必要。


代替

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

代码将更具可读性

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

并且,使用当今的优化编译器,两个版本都可能生成相同的目标代码。一般来说,尤其是当你的代码不工作时,更倾向于可读性而不是优化。


fraction *= 2;  // times by two first

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

于 2012-11-07T06:23:49.447 回答
0
if(!strcmp(argv[3] , "-b"))

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

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

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

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

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

于 2012-11-07T06:29:14.663 回答
0
void decimal2binary(char *decimal, int *binary) {
  decimal = malloc(sizeof(char) * 32);
  ...
}

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

long int dec = myatoi(decimal);

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

所以删除线

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

你会得到正确的答案。

于 2012-11-07T07:10:47.030 回答
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);
}
于 2012-11-07T23:29:09.287 回答