Ошибка бесконечного цикла с моим двоичным и десятичным методом в C? - PullRequest
0 голосов
/ 14 октября 2019

Я получаю бесконечный цикл с моим методом, и я не уверен, почему. Я работаю над методом, который должен преобразовать биты из десятичной в двоичную форму. Я не вижу, что происходит, так как я получаю бесконечный цикл при запуске этого метода. Я надеялся, что смогу получить помощь, почему.

Вот мой код:

int binToDec(char* bin)
{       
        int i = 0;

        int result = 0; // (1) start the decimal result at 0.   
        while(bin != "\n");// (2) remove the most significant binary digit(leftmost) and add it to the result.
        {

        if(bin[i] == '1')
        {       
                result = result * 2 + 1;
        }
        else if(bin[i] == '0')
        {       
                result *= 2;
        } 
        printf("%d\n", result);
        i++;    
        }       // (3) If all binary digits have been removed, you're done. Stop.
                // (4) Otherwise, multiply the result by 2 and go back to step 2.
        return result;
}
/**
 * Create two functions that do binary to decimal conversion and back. Their signatures (aka prototypes)
 * should look like:
 * int binToDec(char* bin);
 * char* decToBin(int dec);
 *
 * For both functions, remember that your string will not hold 0s and 1s, but the characters ‘0’ and ‘1’. 
 * Use the offset to determine the binary value.      
 */
    char* decToBin(int dec)
{

        int i;
        double z;
        for(i = 0; i < dec; i++)
        {
                 z = pow(2, i);
                printf("The bit is %d \n", z);
        }
        char *c = (char*) malloc(dec * sizeof(z));

        while(dec % 2 != 0) //As long as the quotient is not 0, continue to divide the newest quotient by 2.
        {
                c[i] +=  dec % 2 + '0';
                dec = dec / 2; //Divide the value by 2 and record the remainder.        
        i++;
        }
        return c;
}
int main()
{
        int num;
        char *ptr;
        ptr = (char*) malloc(num * sizeof(decToBin(11001)));

        printf("Call to binToDec given 1001 result in: %d\n", binToDec("11001"));
        printf("Call to decToBin given 9 results in : %s\n", decToBin(11001));
        free(ptr);
        return 0;
}

Дайте мне знать. Бесконечный цикл происходит в первом методе.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Посмотрите на эту строку:

while(bin != "\n");

Даже если бы ; не было, условие никогда бы не стало истинным, просто потому, что вы не можете сравнивать строки подобным образом. Это должно было быть

while( strcmp(bin, "\n") != 0 )

Но, глядя на то, что, очевидно, должно было быть телом цикла, вы увеличиваете не указатель bin, а целое число i. Итак, наконец, ваше состояние должно быть

while( strcmp(bin+i, "\n") != 0)

или просто

while( bin[i] != '\n' )

... и без `; 'конечно

И, как правильно упомянул @barmar, если вы вызываете binToDec() со строкой, которая вообще не содержит перевода строки, у вас все равно будет бесконечный цикл. Так как bin должен состоять только из '0' и '1', я бы предложил:

  while( bin[i] == '0' || bin[i] == '1' ) 

или, если вы хотите поддерживать «отформатированные» двоичные строки (например, с пробелом после каждых 8цифры)

  while( bin[i] != '\0' && bin[i] != '\n' ) 

ваше тело цикла уже подойдет для этого, поскольку вы ничего не делаете, если bin[i] не является ни '0', ни '1'

0 голосов
/ 14 октября 2019

Этот цикл

while(bin != "\n");
                 ^^^ 

действительно является бесконечным циклом, поскольку строковый литерал "\ n" в большинстве случаев имеет адрес, отличный от строкового литерала, на который указывает указатель bin. Более того, даже если записать

while( "\n" != "\n");

, цикл также может быть бесконечным, поскольку компилятор (в зависимости от его параметров) может хранить идентичные строковые литералы как разные объекты.

Это утверждение

ptr = (char*) malloc(num * sizeof(decToBin(11001)));

не имеет смысла, поскольку указатель ptr не используется и переменная num не была инициализирована.

И это объявление

char *c = (char*) malloc(dec * sizeof(z));

не имеет смысла. Например, почему используется sizeof( double ) (тип переменной z - double)? И возвращаемая строка из функции не обнуляется.

Также в этих вызовах

printf("Call to binToDec given 1001 result in: %d\n", binToDec("11001"));
                               ^^^^                             ^^^^^

printf("Call to decToBin given 9 results in : %s\n", decToBin(11001));
                              ^^^                             ^^^^^

есть опечатки.

Кажется, вы имеете в виду следующее

#include <stdio.h>

unsigned int binToDec( const char *bin )
{       
        unsigned int result = 0; // (1) start the decimal result at 0.   

        for ( ; *bin != '\0'; ++bin ) // (2) remove the most significant binary digit(leftmost) and add it to the result.
        {
            result = 2 * result + ( *bin == '1' );
        }       // (3) If all binary digits have been removed, you're done. Stop.
                // (4) Otherwise, multiply the result by 2 and go back to step 2.

        return result;
}

int main(void) 
{
    const char *bin = "11001";

    printf( "Call to binToDec given %s result in: %u\n", bin, binToDec( bin ) );

    return 0;
}

Вывод программы

Call to binToDec given 11001 result in: 25
...