Chiarimenti su sprintf, snprintf e formati (era Formati per sprinf)

Ciao a tutti Sto cominciando a studiare sprintf. Dove posso trovare informazioni sui formati disponibili?

Grazie Gianluca

Nel link che ti avevo messo nell'altro thread e su qualsiasi buon libro di 'C' ... è una funzione standard.

Guglielmo

P.S.: ... e San Google, per "sprintf c" ritorna SOLO 3'300'000 risultati con esempi, tutorials e quant'altro :D

Perdonami. Mi era sfuggito il tuo "QUI" e con Google avevo cercato "sprintf arduino" per puntare a discussioni specifiche, ma era troppo restrittivo. Ho trovato anche questo: http://digilander.libero.it/uzappi/C/librerie/funzioni/printf.html

Non ho potuto risponderti prima perché da qualche tempo non riesco a fare login dal telefonino con Android 4.2.2. Apro una discussione in proposito.

Ciao Gianluca

Datman: Non ho potuto risponderti prima perché da qualche tempo ho non riesco a fare login dal telefonino con Android 4.2.2. Apro una discussione in proposito.

C'è l'apposito THREAD ...

Guglielmo

Ho già scritto in "Generale", al livello superiore. Se ho sbagliato, per cortesia, spostatelo.

Grazie

Ah... Vedo che è un unico messaggione! Beh... Lo copio :)

Secondo me se cerchi "printf", senza s iniziale, trovi più roba. La funzione "madre" infatti si chiama così, poi ci sono tutta una serie di sue varianti che funzionano allo stesso modo ma mettono il loro output in un posto diverso: fprintf, sprintf, snprintf, vfprintf, ecc ecc...

A proposito: abituati da subito a usare snprintf al posto di sprintf.

Grazie :)

Ciao a tutti

Vedo che a volte sul nome della stringa che viene composta viene messo l’asterisco. Non mi è ben chiaro il concetto, ma so che indica un puntatore. In snprintf a volte serve e altre no, oppure non ho capito qualcosa?

Grazie
G.

Serve solo se hai un puntatore, appunto, ma non è una peculiarità particolare di printf(), nel senso che questa si aspetta i dati "veri" e non puntatori ad essi, per cui se hai questi ultimi, dovrai dereferenziarli. Posta il codice preciso a cui ti riferisci.

Guarda che in C/C++ il nome di un array è ,implicitamente, un puntatore, per questo motivo nella dichiarazione della printf() buffer e stringhe sono sempre indicate come puntatori. Dal C99 in poi il solo nome di un array, quindi senza quadre con l'indice, è l'equivalente di &array[0], che è il suo puntatore, però non è valido se vuoi assegnare ad un ulteriore puntatore l'array, p.e. se creo "char *P" come puntatore e voglio assegnarlo a "char mybuffer[10]" non posso fare P =mybuffer, ma devo fare P = &mybuffer[0].

astrobeed: Dal C99 in poi il solo nome di un array, quindi senza quadre con l'indice, è l'equivalente di &array[0], che è il suo puntatore, però non è valido se vuoi assegnare ad un ulteriore puntatore l'array, p.e. se creo "char *P" come puntatore e voglio assegnarlo a "char mybuffer[10]" non posso fare P =mybuffer, ma devo fare P = &mybuffer[0].

Dove l'hai sentita questa? Non mi risulta. :astonished:

A me risulta eccome e tanto mi basta. :) Il solo fatto che basta passare il semplicemente il nome del array alla sprintf, che in realtà vuole un puntatore come tutte le funzioni che devono lavorare con degli array in ingresso, dimostra che è così. :) Scherzi a parte, è realmente scritto nel reference del C99, però non mi chiedere la pagina perché sono passati troppi anni da quando l'ho letto, rimane comunque il fatto che il solo nome del array non basta per assegnarli un ulteriore puntatore come da esempio che ho fatto.

Quello dimostra solo che il nome di un array equivale ad un puntatore al suo primo elemento, e su questo non ci piove.

Quel che mi suona strana è la seconda parte del tuo post. Il seguente programma compila senza alcun warning, e funziona come ci si attende, con GCC 4.4.7:

int main (void) {
    int arr[5] = {0, 1, 2, 3, 4};

    int *p = arr;

    printf ("%d %d\n", arr[2], p[2]);

    return 0;
}

E ho compilato con:

gcc -Wall -std=c99 -pedantic

Se non ricordo male infatti, p[2] essendo un "int *" equivale a &(p+sizeof(int)*2)

Al massimo equivale a *(p + sizeof(int) * 2), ma anche su questo non ci piove :).

SukkoPera: Quel che mi suona strana è la seconda parte del tuo post. Il seguente programma compila senza alcun warning, e funziona come ci si attende, con GCC 4.4.7:

Dato che ogni compilatore C fa un "pochino" a modo suo è possibile che in GCC vada bene anche quel tipo di dichiarazione, adesso sono impicciato con il lavoro e non ho tempo per fare prove, però farò qualche verifica con i vari compilatori C/C++ che utilizzo, sopratutto compilatori che non sono GCC.

@astro anche a me pare che molti compilatori accettano la sintassi diretta, vado a memoria ovvio, esempio il visual c mi pare lo accetta.

Si hai ragione, ho scritto male, "*" non "&"... :)

Astro, ho idea che ti confondi con qualche altro tipo di assegnazione. ::)

Tutti i "sacri testi" e manuali vari (... specifici sull'uso dei "pointer" in 'C'), quando parlano di array praticamnete dicono ...

When an array name is used by itself, the array’s address is returned. We can assign this address to a pointer ...

... ed anche gli esempi che si trovano nei vari testi riportano tale tipo di assegnazione. Naturalmente resta validissima l'assegnazione al "pointer" dell'indirizzo del primo elemento dell'array ( &mioArray[0]) ). :)

Guglielmo

nid69ita: @astro anche a me pare che molti compilatori accettano la sintassi diretta, vado a memoria ovvio, esempio il visual c mi pare lo accetta.

Si ma questo non toglie che non è previsto dal C99, che poi i compilatori attuali accettano lo stesso l'assegnazione di un puntatore usando solo il nome del array è un altro paio di maniche, lo standard C99 ha ben 18 anni sulle spalle e le cose cambiano nel frattempo, anche perché tutti i compilatori attuali sono a standard C11. Appena ho un attimo di tempo, spero presto, vi faccio vedere la pagina del reference C99 dove viene citato il limite per l'assegnazione di un puntatore ad un array e "l'obbligo" di usare la notazione per l'address fisico della prima cella del array, mentre per tutti gli altri casi va bene usare solo il nome del array.