Newsgroup: it.comp.lang.c
Titolo: sprintf senza '\0'

Salve a tutti,
mi sembra di capire che l'ANSI C prevede una funzione di libreria chiamata
sprintf, simile alla printf ma con destinazione in RAM e non in stdout.
A quanto pare sprintf aggiunge automaticamente il carattere '\0', è
possibile
evitarlo? Esiste qualche altra funzione che non inserisce il carattere
nullo?
In altre parole, se ho:
---
char stringa[3];
sprintf( stringa, "%3d", x );
---
Voglio che in stringa ci sia il valore di x e basta, senza il carattere
nullo.
E' ovvio che sarò accorto nel programma a non sforare i limiti.

 
snprintf(stringa,3,"%3d",x);
Adieu,
-- 
Lestat de Lioncourt  -- a.k.a --  Ciro Mattia Gonano
 Undergraduate student in Computer Science at University of Bologna
 IHGGer #1049   <=>  ICQ#: 52631406   <=>   URL: 
http://www.CS.UniBO.It/~gonano
 Debian admin at 
Students.CS.UniBO.It
 <=> look at headers for my JabberID & GPG

 possibile evitarlo?
Alla fine copia la stringa, carattere per carattere, nel tuo array, no?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 snprintf(stringa,3,"%3d",x);
Purtroppo non è una funzione standard. Dato che è fattibilissimo anche
senza, meglio non utilizzarla, no?


 
senza puo` dare dei GROSSI problemi di buffer overflow.
Al peggio, lo '\0' finale lo scrive lo stesso dove non dovrebbe.


 Al peggio, lo '\0' finale lo scrive lo stesso dove non dovrebbe.
Ma il problema del buffer eventualmente insufficiente ce l'hai comunque
e quindi lo devi gestire in qualche modo (magari con un buffer
abbastanza grande da non dare prevedibilmente problemi). Oppure pensi
che un programma reale possa far passare in silenzio un troncamento come
quello che proponi?


Purtroppo non è una funzione standard.
Ora credo di sì (C99).
-- 
Andrea Laforgia
"640kb of memory should be enough for anyone." -- Bill Gates.

 Ora credo di sì (C99).
Davvero? Ottimo! Comunque continuo a dire che il problema del
superamento del buffer non si risolve certo troncando l'output, almeno
non in un programma reale (ma per un esercizio va benissimo).


 
snprintf() e` stata pensata proprio per non dare problemi di buffer overflow...


 snprintf() e` stata pensata proprio per non dare problemi di buffer overflow...
Non ci capiamo (forse a causa della lingua?). Se il dato da inserire nel
buffer era lungo, mettiamo, 30 caratteri mentre il buffer è lungo
soltanto 20 caratteri allora memorizzerai in esso solo i primi 20
caratteri del dato, facendo finta che gli altri 10 non siano mai
esistiti. Ti sembra una soluzione valida, generale e definitiva?


 
per quello che vuole fare lui (inserire i primi tre char su una lista di
quattro), decisamente si`.


 quattro), decisamente si`.
Ok, il mio era un discorso generale e pensavo lo fosse anche il tuo.
Infatti avevo specificato (nella parte che hai tagliato) che per un
esercizio poteva anche andare bene.
Ma credo che ora ci siamo capiti, giusto?


 
si`.
Resto comunque dell'idea che per uno che voglia utilizzare C e basta, servano
trucchi del genere per fare cio` che si vuole.
Il C e` a basso livello, e a basso livello il programmatore deve pensare, se
vuole mantenere la velocita` e l'ottimizzazione che deriva dalla potenza del C.
Altrimenti si puo` prendere il C++.


  Undergraduate student in Computer Science at University of Bologna
Ops, allora non sei straniero! Chiedo scusa per il fraintendimento. :-)


> Altrimenti si puo` prendere il C++.
... avrei un gran da ridire sul fatto che le cose in C siano più
efficenti di quelle scritte in C+..
"Language shapes the way we think, and determines what we think
about."
B.L. Whorf
il C ed il C++ sono due linguaggi diversi, implicano delle "tecniche"
di attacco al problema ben differenti..
e credo sia l'unica cosa da dire sui due linguaggi.
ciao
 sbirish

 
np ;)
Adieu,
-- 
Lestat de Lioncourt  -- a.k.a --  Ciro Mattia Gonano
 Undergraduate student in Computer Science at University of Bologna


 
non ho detto che il C++ produca codice meno efficente del C, anzi, se un
programma e` scritto bene avra` efficenza identica sia con C++ che con C
(probabilmente pero` in C++ ci vorra` la meta` del tempo, a scriverlo).
Ad ogni modo il sig. Stroustrup dice che il C fu pensato per essere vicino alla
macchina e sfruttarla al meglio, mentre il C++ fu pensato come un'aggiunta al C
(compreso) per avere un linguaggio vicino al problema da risolvere.
Adieu,
-- 
Lestat de Lioncourt  -- a.k.a --  Ciro Mattia Gonano
 Undergraduate student in Computer Science at University of Bologna
