Newsgroup: it.comp.lang.c
Titolo: Come leggete le stringhe?

Come ben sapete
scanf ("%s",&stringa) si ferma alla prima parola...
gets(stringa) e' da evitare assolutamente perché altamente
insicura; allora che sistema adottare per acquisire
una stringa da stdin?
Sul testo "Pratical C" ho trovato questo espediente:
  fgets (stringa, sizeof(stringa), stdin);
  stringa[strlen(stringa)-1]='\0';  /* sostituisce \n con \0 */
fgets legge al più sizeof(stringa)-1 caratteri (il resto è ignorato)
l'ultimo carattere (un new line) viene sostituito con "il tappo"
di fine stringa "\0".
Ma e' una buona soluzione? Oppure c'e' di meglio? Come fate voi?
Grazie anticipatamente

 Ma e' una buona soluzione? Oppure c'e' di meglio? Come fate voi?
Si fa cosi` di solito ;) Se eventualmente c'e` del parsing da fare si
processa la stringa letta, in modo che lo stream di input sia sempre in
uno stato noto.
Una sola nota: non e` detto che l'ultimo carattere sia il newline (se
l'input era piu` grande dello spazio a disposizione). Fai un controllo
prima di sovrascrivere:
int len = strlen(stringa);
if (stringa[len - 1] == '\n')
        stringa[len - 1] = '\0';
Luca
-- 
Home: 
http://kronoz.cjb.net
Windows NT crashed.
I'm the Blue Screen of Death.
No one hears your screams.

Ho provato a mettere la lettura in una funzione a parte,
ma mi legge solo i primi tre caratteri...
#include <stdio.h>
#include <stdlib.h>
/* prototipo */
/* restituisce la lunghezza della stringa */
int leggistringa (char*);
int main (char* argv[], int argc)
{      
    char nome[255]; 
    int a;
 
    printf ("Come ti chiami? ");   
    a = leggistringa(nome); 
    printf ("Lunghezza stringa: %d caratteri\n",a);
    printf ("Ciao %s e benvenuto \n", nome);
    system ("pause");    
    return 0;            
}
int leggistringa (char* stringa)
{
    fgets (stringa, sizeof(stringa), stdin);
    if (stringa[strlen(stringa)-1]=='\n')
        stringa[strlen(stringa)-1]='\0';
    return strlen(stringa-1); /* ritorna l'effettiva lunghezza della
stringa */
}     

   stringa[strlen(stringa)-1]='\0';  /* sostituisce \n con \0 */
fgets() è la soluzione migliore, ma in questo caso è usata male.
Non è affatto detto, infatti, che l'ultimo carattere letto da fgets() 
sia il new-line.  Bisogna comunque testare.
Io incapsulerei il tutto in una funzione (scrivo al volo, senza compilare):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *read_string(char *buf, size_t bufsz, FILE *fp) {
    size_t len=0;
    char *res=fgets(buf, bufsz, fp);
    if (res) {
       len=strlen(buf);
       if (buf[len-1]=='\n') buf[len-1]='\0';
    }
    return res;
}

 }     
Ma cazzo, sara` stato ripetuto 1000 volte! L'ho scritto giusto ieri in
un'altro messaggio... array e puntatori non sono la stessa cosa, anche
se ci sono dei punti in comune.
Una volta che un'array e` decaduto a puntare a primo elemento si perdono
tutte le informazioni ad esso relative.
int leggistringa (char* stringa) {
        ...
        sizeof(stringa) <----
In questo esempio sizeof restituisce la dimensione di un char*
(tipicamente 4byte, ecco perche` legge solo 3 caratteri).
Devi necessariamente passare anche la lunghezza del buffer:
int leggistringa(char *stringa, size_t len) {
        int ret;
 
        fgets(stringa, len, stdin);
        ret = strlen(stringa) - 1;
        if (stringa[len] == '\n')
                stringa[len] = '\0';
        return ret;
}
Luca
-- 
Home: 
http://kronoz.cjb.net
"La teoria e` quando sappiamo come funzionano le cose ma non funzionano.
 La pratica e` quando le cose funzionano ma non sappiamo perche`.
 Abbiamo unito la teoria e la pratica: le cose non funzionano piu` e non
 sappiamo il perche`." -- A. Einstein

void get_input(char *format, void *variable)
{
    static char linebuffer[255];
    char *pin;
    fgets(linebuffer, 255, stdin);
    pin = strrchr (linebuffer, '\n')
    if (pin!=NULL) {
       *pin = '\0';
   }
   sscanf(linebuffer,format,variable);
}