Эта очищенная версия вашего кода производит вывод:
$ ./xx 20
strcmp(1, 20) = -1
strcmp(2, 20) = -48
strcmp(4, 20) = 2
strcmp(8, 20) = 6
strcmp(16, 20) = -1
strcmp(32, 20) = 1
strcmp(64, 20) = 4
strcmp(128, 20) = -1
strcmp(256, 20) = 5
strcmp(512, 20) = 3
strcmp(1024, 20) = -1
strcmp(2048, 20) = 52
strcmp(4096, 20) = 2
strcmp(8192, 20) = 6
strcmp(16384, 20) = -1
strcmp(32768, 20) = 1
strcmp(65536, 20) = 4
strcmp(131072, 20) = -1
strcmp(262144, 20) = 6
strcmp(524288, 20) = 3
strcmp(1048576, 20) = -1
strcmp(2097152, 20) = 57
strcmp(4194304, 20) = 2
strcmp(8388608, 20) = 6
strcmp(16777216, 20) = -1
strcmp(33554432, 20) = 1
strcmp(67108864, 20) = 4
strcmp(134217728, 20) = -1
strcmp(268435456, 20) = 6
strcmp(536870912, 20) = 3
strcmp(1073741824, 20) = -1
$
Достаточно сказать, что есть много небольших изменений.
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
static void removeFloatZeros(char *floatvalue)
{
char *ptr = strchr(floatvalue, '.');
*ptr = '\0';
}
static void decimalToBinary(char *decimal)
{
int x;
double power = 0;
char *twosPower = malloc(sizeof(char *) * 1024);
/* What is the greatest power of 2 that will fit into the decimal? */
for(x = 0; x <= 30; x++)
{
power = pow(2.0, x);
snprintf(twosPower, 1023, "%f", power);
removeFloatZeros(twosPower);
printf("strcmp(%s, %s) = %d\n", twosPower, decimal, strcmp(twosPower, decimal));
//printf("strcmp(decimal, twosPower) = %d\n", strcmp(twosPower, decimal));
memset(twosPower, '\0', 1023);
}
free(twosPower);
}
int main(int argc, char*argv[])
{
for (int i = 1; i < argc; i++)
decimalToBinary(argv[i]);
return 0;
}
Отображение сравниваемых значений делаетвещи намного легче понять.Вам необходимо освободить память (или использовать автоматические массивы).Вам нужно использовать заголовки.Декларации static
не являются необходимыми на 100%, но означают, что я не получаю никаких предупреждений при компиляции с настройками компилятора über-fussy.
Но ключевое изменение - это распечатка значений, которыесравнение - имеет смысл цифры от strcmp()
.
(рассмотрите возможность добавления подходящего числа ведущих нулей перед выполнением сравнения.)