Unsigned short int a Binario in C senza l'uso di malloc() funzione?

0

Domanda

Ho scritto un programma che cambia un unsigned int a in binario. Nella mia funzione di utilizzare la funzione malloc (). Mi chiedevo se c'era un modo per farlo senza la malloc().

#include <stdio.h>
#include <stdlib.h>

char *toBinary(unsigned n);

int main(void) {
     int n;

     printf("Enter an integer to convert: ");
     scanf("%d",&n);

     char* binary = toBinary(n); 

     printf("%s",binary);

     return 0;
} 


char* toBinary(unsigned n) {
     char* binary = (char*)malloc(sizeof(char) * 16);
     int j = 0;
     unsigned i;
     for (i = 1 << 16; i > 0; i = i / 2) {
             if(j == 8)
                   binary[j++] = ' ';
             else
                   binary[j++] = (n & i) ? '1' : '0'; 
     }
    binary[j]='\0';
    return binary;
}
~                      
bit c type-conversion unsigned-integer
2021-11-22 16:11:50
1

Migliore risposta

1

Abbastanza semplice: superato la fase di pre-buffer allocato alla funzione:

typedef enum
{
    CE_NoError,
    CE_InsufficientMemory,
} ConversionError;

ConversionError toBinary(unsigned int n, size_t length, char binary[length])
{
   // check first if length suffices to hold all characters
   // plus the terminating null character

   // use the array passed to instead of the one malloc'ed one...
}

Utilizzo:

char binary[sizeof(unsigned int) * CHAR_BIT + /*1*/ 2]; // (!): intermediate space!
if(toBinary(theValue, sizeof(binary), binary) != CE_NoError)
{
    // appropriate error handling!
}

Invece di enum si potrebbe tornare bool (è necessario includere stdbool.h per l') se si considera il enum eccessivo per un solo tipo di errore...

Nota a margine: Sostituire unsigned int (come proveniente dal tuo codice) con unsigned short se si desidera effettivamente la conversione di quest'ultimo, come nel titolo (e come per il ciclo indica).

2021-11-22 16:52:20

unsigned short -> unsigned int. unsigned n è equivalente a unsigned int n
Jabberwocky

In stile moderno, faresti meglio con int toBinary(unsigned n, size_t length, char binary[length]) { … } dove la chiave del cambiamento è nell'elenco di argomenti (specificare la dimensione e poi usarlo nella dichiarazione di matrice), e la secondaria di cambiamento per tornare int lo stato, in modo che se il buffer è troppo piccolo, è possibile segnalare l'errore. Classicamente, ritorna 0 se tutto è OK e alcuni di loro, probabilmente negativo, il valore in caso di fallimento.
Jonathan Leffler

@JonathanLeffler 0 "è OK" regola del pollice in realtà è più vero per l'uscita lo stato dei programmi che i valori di ritorno delle funzioni in C.
Peter - Reinstate Monica

@Pietro-ReinstateMonica — essa non dipende da dove si guarda. Unix chiamate di sistema che non dispone di altre informazioni di ritorno restituiscono 0 in caso di successo e -1 in caso di errore. POSIX Pthreads restituisce 0 in caso di successo e un (positivo) numero di errore in caso di fallimento. Il software con cui lavoro utilizza prevalentemente 0 in caso di successo e (soprattutto) negativo in caso di errore. Ci sono esempi contrari: IIRC, OpenSSL restituisce 0 in caso di errore. Si paga il vostro denaro e prende la vostra scelta. Io preferisco lo zero in caso di successo variante.
Jonathan Leffler

@JonathanLeffler Esattamente -- molte funzioni di restituire qualcosa. Programmi in grado di "restituire" un risultato come output (grep etc.) e in aggiunta fornire una diagnostica codice di uscita; funzioni che spesso non sono progettati per questo (anche se il paradigma di " bool tryXY(some_arg, alcuni result_ref) sembra diventato più comune, soprattutto per C# e Java perché consente di risparmiare un alloc/paio. Ma poi "OK" 1 ;-) ) Il valore di ritorno (o equivalente) spesso porta a stile elegante, come (while(cin >> i)).
Peter - Reinstate Monica

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................