Pagina 2 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 31

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Grazie

  2. #2
    Tra l'altro, se devi concatenare tante stringhe la sprintf è anche più efficiente: se fai:
    codice:
    char buf[1024]="asd";
    strcat(buf, var1);
    strcat(buf, var2);
    strcat(buf, var3);
    strcat(buf, var4);
    strcat(buf, var5);
    ciascuna strcat deve scorrersi la stringa fino in fondo per sapere da dove iniziare a copiare; al contrario, una sprintf
    codice:
    char buf[1024];
    sprintf("asd%s%s%s%s%s", var1, var2, var3, var4, var5);
    tiene traccia internamente di dove è arrivata, per cui in ultima analisi risulta più efficiente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Era esattamente questo che volevo capire inizialmente! Grazie mille

  4. #4
    @Dany_ occhio che sprintf di per sé può portare a buffer overflow. Il codice sopraesposto non controlla che le var* entrino in buf. Usa snprintf per maggiore sicurezza:
    codice:
    snprintf(buff, sizeof(buf), format, ...);
    e controlla che abbia successo. man sprintf(3)
    Ultima modifica di signoredeltempo; 18-01-2015 a 18:59

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Io ho fatto così:
    codice:
    char *buf;
    buf = calloc(lunghezzaDesiderata + 1, sizeof(char));
    sprintf(buf, ".....", ...);
    Va bene lo stesso? Nel senso che avendo calcolato prima la dimensione di buf in base a quello che ci devo mettere dentro, quando faccio la sprintf dovrebbe essere tutto ok immagino!

  6. #6
    Quella è parte della soluzione. O usi snprintf o controlli la lunghezza di ogni membro (cosa ripetitiva per tipi non-stringa).
    Es:
    codice:
    char buf[5];
    sprintf(buff, "%d", 123456789); // buffer overflow

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Cioè sarebbe più corretto così?

    codice:
    char *buf;
    buf = calloc(lunghezzaDesiderata + 1, sizeof(char));
    snprintf(buf, sizeof(buf), ".....", ...);

  8. #8
    Sì. Citando man sprintf
    Because sprintf() and vsprintf() assume an arbitrarily long string, callers must be careful not to overflow the actual space; this is often
    impossible to assure. Note that the length of the strings produced is
    locale-dependent and difficult to predict. Use snprintf() and
    vsnprintf() instead (or asprintf(3) and vasprintf(3)).


  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Facendo così però ho un warning che dice:
    "argument to ‘sizeof’ in ‘snprintf’ call is the same expression as the destination; did you mean to provide an explicit length?"

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Grazie, gentilissimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.