Domanda

Non faccio uso correttamente le identificatori di formato in C. Un paio di righe di codice:

int main()
{
        char dest[]="stack";
        unsigned short val = 500;
        char c = 'a';

        char* final = (char*) malloc(strlen(dest) + 6);

        snprintf(final, strlen(dest)+6, "%c%c%hd%c%c%s", c, c, val, c, c, dest); 

        printf("%s\n", final);
        return 0;
}

Quello che voglio è quello di copiare a

finale [0] = un char a caso finale [1] = a char casuale finale [2] e finale [3] = breve matrice finale [4] = un altro char ....

Il mio problema è che voglio copiare i due byte del short int a 2 byte della matrice finale.

Grazie.

È stato utile?

Soluzione

Sono confuso - il problema è che si sta dicendo strlen(dest)+6 che limita la lunghezza della stringa final a 10 caratteri (più un terminatore null). Se dite strlen(dest)+8 allora non ci sarà abbastanza spazio per la stringa completa.

Aggiorna

Anche se breve può essere solo 2 byte, quando viene stampata come una stringa di caratteri ciascuna assumerà un byte. In modo che significa che può richiedere fino a 5 byte di spazio per scrivere un breve per una stringa, se si sta scrivendo un numero superiore a 10000.

Ora, se si scrive la breve per una stringa come un numero esadecimale utilizzando l'identificatore di formato %x, ci vorranno non più di 2 byte.

Altri suggerimenti

È necessario allocare spazio per 13 caratteri -. Non 11. Non dimenticare il NULL di terminazione

Quando si formatta il numero (500) occupa tre spazi, non uno. Così il vostro snsprintf dovrebbe dare la lunghezza finale come strlen(dest)+5+3. Poi anche correggere la chiamata malloc per regolare. Se si vuole calcolare la strlen del numero, farlo con una chiamata del genere strlen(itoa(val)). Inoltre, posso dimenticare il NULL alla fine del dest, ma penso che strlen tiene conto di questo, ma non ne sono sicuro.

semplice risposta è si allocato solo spazio sufficiente per i strlen (dest) + 6 caratteri, quando in tutte le realtà sembra che si sta andando ad avere 8 caratteri in più ... da quando si dispone di 2 caratteri + 3 caratteri nel tuo numero + 2 caratteri dopo il + dest (5 caratteri) = 13 char quando assegnato 11 caratteri.

Unsigned shorts possono richiedere fino a 5 caratteri, giusto? (0 - 65535)

Sembra che avresti bisogno di destinare 5 caratteri per il vostro unsigned short per coprire tutti i valori.

Il che puntare a utilizzare questo:

char* final = (char*) malloc(strlen(dest) + 10);

Si perde un byte perché si pensa che la variabile di breve prende 2 byte. Ma ci vuole tre: uno per ogni carattere cifra ( '5', '0', '0'). Inoltre è necessario un terminatore '\0' (1 byte).

==> È necessario strlen(dest) + 8

L'uso 8 invece di 6 il:

char* final = (char*) malloc(strlen(dest) + 6);

e

snprintf(final, strlen(dest)+6, "%c%c%hd%c%c%s", c, c, val, c, c, dest);

Sembra che l'equivoco principale è che un breve "2 byte" non può essere rappresentato su schermo come 2 caratteri a 1 byte.

In primo luogo, lasciare spazio sufficiente:

char* final = (char*) malloc(strlen(dest) + 9);

L'intera gamma di valori possibili per un carattere 1 byte non sono stampabili. Se si desidera visualizzare questo sullo schermo e essere leggibile, dovrete codificare il breve 2 byte, come 4 byte esadecimale, come ad esempio:

## as hex, 4 characters
snprintf(final, sizeof(final), "%c%c%4x%c%c%s", c, c, val, c, c, dest);

Se si sta scrivendo questo in un file, che è OK, e si potrebbe provare quanto segue:

## print raw bytes, upper byte, then lower byte.
snprintf(final, sizeof(final), "%c%c%c%c%c%c%s", c, c, ((val<<8)&0xFF), ((val>>8)&0xFF), c, c, dest); 

Ma questo non ha senso ad un essere umano guardarla, ed è sensibile ai endianness. Mi piacerebbe fortemente consiglio contro di esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top