Я написал этот метод, чтобы найти наибольшую степень числа 2, которая будет соответствовать заданному десятичному числу. Десятичное число находится в формате массива символов, чтобы избежать ошибки переполнения ввода при хранении чисел. Степени числа 2 рассчитываются в формате pow(2, power) числа с плавающей запятой, т.е. 8.000000 Затем этот номер отправляется методу для удаления точки и нулей в этом следе. т.е. 8.000000 превращается в 8
1 #include <string.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <memory.h>
5 #include <math.h>
6
7 int i;
16
17 void removeFloatZeros(char *floatvalue)
18 {
19 char *ptr = strchr(floatvalue, '.');
20 *ptr = '\0';
21 }
22
45
173 char *decimalToBinary(char *decimal)
174 {
176 int x;
177 double power = 0;
178 char *binary = malloc(sizeof(char *) * 1024);
179 char *twosPower = malloc(sizeof(char *) * 1024);
180
181 /* What is the greatest power of 2 that will fit into the decimal? */
182 for(x = 0; x <= 30; x++)
183 {
184 power = pow(2.0, x);
185 snprintf(twosPower, 1023, "%f", power);
186 removeFloatZeros(twosPower);
189 printf("strcmp(decimal, twosPower) = %d\n", strcmp(twosPower, decimal));
190 memset(twosPower, '\0', 1023);
191 }
214 }
215
216 int main(int argc, char*argv[])
217 {
218 char *dec1 = argv[1];
219 decimalToBinary(dec1);
220 return 1;
221 }
222
Например, если я введу 20 в argv[1], он выведет:
strcmp(decimal, twosPower) = -1
strcmp(decimal, twosPower) = -1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = -1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = -1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = -1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = -1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = -1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = -1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = -1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = -1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = 1
strcmp(decimal, twosPower) = -1
Где я ошибаюсь в этом? Кроме того, игнорируйте конечное условие цикла for. Предполагается, что он выводит все 1 до 6-й итерации и все -1 на 6-й и после 6-й итерации.
strcmp
? Я не думаю, чтоstrcmp
сломан. - person Cascabel   schedule 18.02.2012strcmp()
, ведет себя неправильно, является признаком новичка. Проблема должна быть в том, как вы его используете, а не в такой базовой функции. - person Jonathan Leffler   schedule 18.02.2012sizeof(char)
, либо ничего (просто 1024). - person Irfy   schedule 18.02.2012sizeof(char)
это1
, так зачем его печатать? - person Carl Norum   schedule 18.02.2012sizeof(char)
подразумевает, что вы не знаете, в каких единицах измеряетсяsizeof
. Это аналогично написаниюhow_many_meters_in(1_meter)
. - person R.. GitHub STOP HELPING ICE   schedule 18.02.2012