Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [c] problema con sprintf

    Ciao a tutti!!!

    Non riesco a capire che serve settare la precisione alle stringhe!!!
    per esempio , che differenza c'è tra :

    codice:
    char buf[100];
    sprintf(buf,"%.50s", "ciao"); 
    sprintf(buf, "%s", "ciao");
    A video non cambia niente, ma questo tipo di notazione è molto usato per la formattazione dei buffer.
    Che differenza c'è???

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Per capire la differenza, prova questo

    codice:
    char buf[6];
    sprintf(buf,"%.5s", "1234567890");
    e questo

    codice:
    char buf[6];
    sprintf(buf,"%s", "1234567890");
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Capito inserisce i numeri di caratteri che hai specificato come precisione!!! Quindi questo può essere un buon modo per evitare buffer overflow???

    Comunque io questo comportamento lo facevo con la snprintf. La differenza tra le due funzioni e che sprintf non inserisce il carattere di fine stringa, mentre snprintf inserisce il carattere di fine stringa, giusto?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da PeppePes88
    Capito inserisce i numeri di caratteri che hai specificato come precisione!!! Quindi questo può essere un buon modo per evitare buffer overflow???


    Comunque io questo comportamento lo facevo con la snprintf.
    Sì, è la snprintf che viene usata per questo tipo di compito.

    La differenza tra le due funzioni e che sprintf non inserisce il carattere di fine stringa, mentre snprintf inserisce il carattere di fine stringa, giusto?
    In che senso?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    In che senso?
    Mi spiego con un esempio che è più chiaro :
    codice:
    char buf[10];
    sprintf(buf, "%.5s", "1234567890"); 
    // output 12345 
    snprintf(buf, 5, "%s", "1234567890"); 
    // output 1234
    Facendo stampare l'output di tutto il buffer la snprintf metteva come quinto carattere il carattere di fine stringa....

  6. #6
    ... mentre la sprintf lo mette come sesto. È normale, lo specificatore di larghezza della sprintf è relativo al singolo campo che stai inserendo, mentre il limite della snprintf è relativo alla stringa di output (e viene inteso come dimensione massima del buffer, NUL incluso).
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Ovvero ... la formattazione con la sprintf permette di inserire 5 caratteri [/b]più[/b] il NUL finale, la snprintf inserisce 5 caratteri [/b]compreso[/b] il NUL.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.