PDA

Visualizza la versione completa : [C] Funzione sprintf() e precisione delle stringhe


PeppePes88
05-12-2009, 20:55
Ciao a tutti!!!

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



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'???

oregon
05-12-2009, 21:01
Per capire la differenza, prova questo



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


e questo



char buf[6];
sprintf(buf,"%s", "1234567890");

PeppePes88
06-12-2009, 12:30
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?

oregon
06-12-2009, 12:44
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???

S



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?

PeppePes88
06-12-2009, 15:08
In che senso?
Mi spiego con un esempio che pi chiaro :


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

MItaly
06-12-2009, 15:17
... 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).

oregon
06-12-2009, 15:33
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.

Loading