#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"
答案 0 :(得分:1)
该行:
long int fractionfactor = .1;
会将fractionfactor
设置为0
,因为该变量定义为整数。请尝试使用float
或double
。
类似地,
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);
}