Newsgroup: it.comp.os.linux.development
Titolo: Richiesta Input (scanf, fgets)

Scusate la domanda forse banale .. ma con manuali, internet, libri, non 
riesco a farlo funzionare:
Con questo codice :
char serv_host[100]; //Host Name del Server
char porta[4]; //porta su cui ricevo
char nickname[20];//Stringa con il My Nick
//memorizzo il nick dell'utente
printf("inserisci il tuo nickname: ");
fgets(nickname, MAX, stdin);
printf(nickname);
//memorizzo la porta per le comunicazioni
printf("Inserisci la tua porta: ");
fgets(porta, MAX, stdin);
printf(porta);
//Chiedo il nome dell'host del Server
printf("Inserisci il nome del server:");
fgets(serv_host, MAX, stdin);
printf(serv_host);
printf(porta);
Tutti i printf mi danno il valore giusto.
L'ultimo printf pero' invece di tornarmi solo il numero della porta mi 
da anche attaccato il valore di serv_host.
Dovrebbe essere un problema di puntatori , come si puo' risolvere ??
Quello c he no ncapisco e' perche non mi fa la stessa cosa con nickname 
e porta ??
Vi prego aiutatemi.
Andrebbe bene anche una soluzione diversa per chiederel'input.
Sono passato ad fgest dopo che non sono riuscito con scanf a fare input 
con degli spazi in mezzo bianchi.
Grazie


In questo modo porta non puo' superare le 3 cifre in qanto devi usare un char
per il terminatore ('\0').
Alessandro.

 nickname e porta ??
Che ci sia di mezzo la fgets? che sia il fatto che li inserisci tu
digitando?
hint: rivedere l'uso di printf
HappyCactus maieutico
-- 
HappyCactus - Linux User #209744 - LFS User #6046 - >>> SMSPM1050 <<<
              YAGF Member Group >>> 
www.google.com
 <<<
Ci sono 10 categorie di persone al mondo: quelle che capiscono
il sistema binario e quelle che non lo capiscono.

avendo fatto un po' di prove credo che il tuo problema sia questo
tu dichiari una char porta[4]
questo significa che allochi 4 celle di memoria per contenere la stringa
"porta". Poichè ogni stringa ha bisogno del carattere '\0' infondo
significa che in "porta" potrai memorizzare una stringa di soli 3
caratteri.
// USANDO FGETS
ho notato che fgets prende tutti i caratteri immessi sullo stdin fino ad
invio, compreso quest'ultimo. ragion per cui potrai scrivere su "porta"
soltanto una stringa di due caratteri, infatti delle 4 celle allocate
avrai nella 3° cella il carattere di invio (\n) e nella 4° il carattere
'\0'. Questo non succede con una scanf (che immagino avrai usato
scanf("%s"..) poichè l'invio non viene memorizzato)
a questo punto cosa succede.
supponiamo (ed è così) che vengano allocate 4 celle per "porta" con gli
indirizzi in memoria messi in sequenza, e precisamente dove finisce lo
spazio per "porta" inizia quello per "serv_host".
se tu vai a memorizzare una stringa maggiore di 2 caratteri succede questo
(supponiamo di inserire la porta 9987)
                    qui inizia lo spazio per serv_host
                      |
[ 9 ][ 9 ][ 8 ][ 7 ][ \n][ \0 ][   ][   ][   ][   ]...
 |
qui inizia lo spazio per porta
come vedi gli ultimi due caratteri sono finiti sullo spazio destinato ad
ospitare la stringa per "serv_host", e quando quest'ultima verrà inserita
sovrascriverà quei 2 caratteri. (inseriamo localhost)
                    qui inizia lo spazio per serv_host
                      |
[ 9 ][ 9 ][ 8 ][ 7 ][ l ][ o ][ c ][ a ][ l ][ h ]...
 |
qui inizia lo spazio per porta
ed ecco spiegato l'arcano. come già detto ogni strinaa deve finire con il
carattere \0 per indicare che è finita, ma la printf il primo carattere \0
che incontra è quello infondo a localhost, ragion per cui printerà
9987localhost
Ciao, Matic
Ps. spero che la formattazione sia leggibile

 Ps. spero che la formattazione sia leggibile
Grazie mille ... mi hai salvato la vita .... i manuali che ho non sono 
pernulla chiari.

 pernulla chiari.
Sistema quella format string vulnerability...
HappyCactus che meglio printf ("%s", string); che printf (string);,
soprattutto se string e' sotto controllo dell'utente...


meglio printf ("%s", string); che printf (string);,
Oppure puts() che dovrebbe essere piu' efficiente...
Alessandro.

 da anche attaccato il valore di serv_host.
Hai definito porta come un array di 4 caratteri... Una stringa deve
essere terminata da un \0, ed inoltre fgets mette il \n nella stringa.
Quindi, se vuoi poter usare tutte le porte (dalla 1 alla 65534) devi
fare un array di 7 caratteri (5 cifre + '\n' + '\0').
PS: non passare come secondo parametro di fgets sempre MAX se poi gli
array che passi come primo parametro non sono tutti di dimensione MAX...
-- 
*    Matteo Gottardi | 
mat...@tin.it
    *
*            ICQ UIN 20381372            *
* Linux - the choice of a GNU generation *
-----= Posted via Newsfeeds.Com, Uncensored Usenet News =-----
http://www.newsfeeds.com
 - The #1 Newsgroup Service in the World!
-----==  Over 80,000 Newsgroups - 16 Different Servers! =-----

 '\0'. 
Stai  facendo confusione:  si  ferma quando  legge  un newline  _oppure_
quando ha letto  MAX-1 caratteri, dipende da quale  delle due condizioni
si verifica per prima.
char foo[4];
fgets(foo, 4, stdin);
Se inserisco come input la stringa "abcd\n" il contenuto di foo sara`:
{'a', 'b', 'c', '\0'}
senza alcun newline.
ciao
K
-- 
Home: 
http://kronoz.cjb.net
I went to God just to see
And I was looking at me
Saw heaven and hell were lies
When I'm God everyone dies