identificatore di formato per intero corto
-
22-10-2019 - |
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.
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 short
s 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.