Unsigned short int se Binární v C bez použití funkce malloc ()?

0

Otázka

Napsal jsem program, který změní unsigned int do binární. Ve své funkci jsem se používat funkce malloc (). Přemýšlel jsem, jestli tam byl způsob, jak to udělat bez 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

Nejlepší odpověď

1

Docela jednoduché: Projít pre-přidělené vyrovnávací paměti funkce:

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...
}

Použití:

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

Místo enum můžete vrátit bool (je třeba zahrnout stdbool.h k) pokud se domníváte, enum overkill jen jeden typ chyby...

Poznámka: Nahradit unsigned int (jak jde z vašeho kódu) s unsigned short pokud si skutečně chcete převést na druhý jako v názvu (a jako pro smyčky označuje).

2021-11-22 16:52:20

unsigned short -> unsigned int. unsigned n je ekvivalentní k unsigned int n
Jabberwocky

V moderním stylu, udělal bys lépe int toBinary(unsigned n, size_t length, char binary[length]) { … } kde klíčem je změna v seznamu argumentů (upřesněte velikost a pak ji použít v poli prohlášení), a sekundární změna je vrátit int stav tak, že pokud vyrovnávací paměť je příliš malá, můžete odeslat zprávu o chybě. Klasicky, vrátí 0, pokud je vše v POŘÁDKU, a některé jiné, pravděpodobně negativní, hodnota na selhání.
Jonathan Leffler

@JonathanLeffler "0 je OK" pravidlo ve skutečnosti je více platí pro výstupní status programy, než návrat hodnoty z funkce v C.
Peter - Reinstate Monica

@Peter-ReinstateMonica — to záleží na tom, kde se podíváte. Unix systémová volání, které nemají další informace k návratu vrací 0 při úspěchu a -1 v případě neúspěchu. POSIX Pthreads vrací 0 při úspěchu a (kladné) číslo chyby v případě neúspěchu. Ten software, který jsem pracovat s většinou používá 0 pro úspěch a (většinou) negativní na selhání. Existují pult-příklady: IIRC, OpenSSL vrací 0 v případě neúspěchu. Ty platí své peníze a bere si vybrat. Jsem raději nulu na úspěch varianta.
Jonathan Leffler

@JonathanLeffler Přesně -- mnoho funkcí, něco vrátit. Programy mohou "vrátit" výsledek jako výstupní (grep atd.) a kromě poskytování diagnostické výstupní kód; funkce často nejsou určeny pro tento (i když paradigmatu `bool tryXY(some_arg, některé result_ref) se zdá být častější, zejména pro C# a Java, protože to šetří alloc/free-pair. Ale pak "OK" je 1 ;-) ) bool návratu (nebo ekvivalent) často vede k elegantní styl, jako je (while(cin >> i)).
Peter - Reinstate Monica

V jiných jazycích

Tato stránka je v jiných jazycích

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