Printf со строкой не работает (2 способа: функция возвращает значение и просто значение) - PullRequest
0 голосов
/ 05 февраля 2019

Итак, моя проблема в том, что когда я хочу напечатать% s (char *), программа показывает пустую строку.Вот мой код, и я пронумеровал все вопросы внутри комментариев в программе

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *decToBinary(char *num, int size);

int main(){
    char *n;
    n = (char *)malloc(5);  
    //memset(n, 0, 5);
    printf("Enter n: ");

    // getting the number as a string
    scanf("%s", n);
    int size = 33;
    char *binNum;
    binNum = (char *)malloc(size);  
    memset(binNum, 0, size);

    //copying the (char *) which is returned by function to char binNum[33] 
    strcpy(binNum, decToBinary(n, size));

    //sprintf(binNum, "%s", decToBinary(n, size));

    // Printing the FUNCTION variable as a character in a loop. WORKS(WHY?)(3)
    for(int i = 0; i < size; i++){
        printf("With function: %c", decToBinary(n, size)[i]);
    }
    //Printing the variable binNum as a string <--------- DOES NOT WORK. JUST EMPTY MESSAGE(WHY?)(4)
    printf("In main: %s\n", binNum);

    // Printing the variable binNum as a character in a loop <------------ DOES NOT WORK(5)
    for(int i = 0; i < size; i++){
        printf("with variable: %c", binNum[i]);
    }
    printf("\n");
}

char *decToBinary(char *num, int size){
    // convert decimal to binary
    int i = size - 2;
    int remainder;
    int decimal;
    char *binary;
    int n;
    n = atoi(num); 
    binary = (char *)malloc(size);
    binary[size - 1] = '\0';
    memset(binary, 0, size);
    do{
        remainder = n % 2;
        n /= 2;
        binary[i] = remainder + '0';
        i--;
    }while(n);
    printf("decToBinary = %s\n", binary); // does not work as string (1)
    for(int j = 0; j < size; j++){
        printf("%c", binary[j]); // but this works(2)
    }
    printf("\n");
    return binary;   
}
  • (1) Строка не отображается в функции.Даже если я очищаю буфер с помощью "\ n"
  • (2), но когда я использую цикл "for" и отображаю каждый элемент массива с помощью% c - это работает.Но это не очень хороший способ заставить его работать
  • (3) В функции main () printf каждого элемента возвращаемого значения из функции работает нормально, хотя я не понимаю, как она может работать,потому что, как я понял, функция вызывается 33 раза, а значение возвращается 33 раза, и здесь я просто читаю один элемент за другим.Думаю, это плохая практика.
  • (4) Поэтому я скопировал возвращенное значение из функции в переменную binNum и попытался отобразить его, используя% s, но снова отображается пустая строка.
  • (5) То же самое с переменной, но с использованием цикла for и% c.Также не работал

Итак, мой вопрос, как справиться с этими проблемами?

1 Ответ

0 голосов
/ 05 февраля 2019

Если вы немного измените свой код

    for(int j = 0; j < size; j++){
        printf("%c 0x%02x\n", binary[j], binary[j]); // but this works(2)
    }

, вы увидите ведущий '\0' в своем результате:

With function: 1decToBinary =
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
1 0x31
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
1 0x31
1 0x31
 0x00

Так что в вашей функции что-то не так decToBinary.

Вы считаете с i от конца массива, поэтому в зависимости от ввода вы можете не достичь начала массива.

Вы можете попробовать return binary+i+1; вконец decToBinary.Это вернет указатель на символ, который вы написали последним.Обратите внимание, что вам не следует перебирать size символов результата, но только до '\0.

Это не окончательное решение, поскольку вы используете malloc для выделения массива символов в decToBinary,Это означает, что вы должны вернуть указатель, полученный из malloc, и вызвать free в вызывающей функции.

Для этого вы можете использовать дополнительный цикл, который копирует все символы из индекса i+1 до'\0' к началу массива.

    for(i++, j=0; binary[i]; i++, j++) {
        binary[j] = binary[i];
    }
    binary[j] = '\0';

    /* ... */

    return binary;

Дополнительное примечание:

Подобный код создает утечку памяти, поскольку вы не free получаете результаты повторных вызовов decToBinary:

    for(int i = 0; i < size; i++){
        printf("With function: %c", decToBinary(n, size)[i]);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...