Newsgroup: it.comp.lang.c
Titolo: lettura da tastiera con read

Ciao a tutti,
devo inserire da tastiera due campi (nome utente e password). 
Ogni campo deve avere almeno 1 carattere e al massimo 10. Io ho 
fatto così:
char* mit;
char* psw;
do{
mit=malloc(grandezza_campo_mittente);
psw=malloc(grandezza_campo_psw);
puts("Inserisci i tuoi dati per poter registrarti");
puts("inserire nome utente - max 10 caratteri");
read(0,mit,grandezza_campo_mittente);
//controllo
if(strlen(mit)<2){
puts("campo mittente non valido .... almeno 1 carattere\n");
free(mit);
free(psw);
continue;
}
puts("inserire password - max 10 caratteri");
read(0,psw,grandezza_campo_psw);
if(strlen(psw)<2){
puts("campo password non valido .... almeno 1 carattere");
puts("dati invalidati\n");
free(mit);
free(psw);
continue;
}
però non funziona (compila correttamente).
se inserisco più di 10 caratteri nel nome utente, non mi chiede 
di inserire la password, perchè prende come password i restanti 
caratteri tolti i 10. Inoltre considera l'invio come carattere 
\n. Cosa posso fare?
Grazie mille!!!
-- 
Inviato da Virgilio 
http://newsgroup.virgilio.it
..un servizio di news via web con in piu' l'antispam

 Grazie mille!!!
Il comportamento che noti č corretto, sei tu che devi inventare qualcosa se
non ti soddisfa.
Io ti consiglio di fare un ciclo controllato da una select per 'mangiare'
tutti i caratteri in eccedenza e posizionare poi un \0 nella posizione piů
conveniente, eliminando il \n.
Ciao
-- 
none

 select per 'mangiare' tutti i caratteri in eccedenza
grazie per il consiglio.
Ho fatto una funzione così:
int mangiaCaratteriInutili(){
	int r;
	char t;
 
	puts("dentro mangiaCaratteriInutili");
	do{
		r=read(0,t,1);
		if(r==-1) return -1;
		if(r==0) return 1;
	}while(1);
}
che però cicla all'infinito :(
Io ho ragioanto così: r dovrebbe restituire il numero di byte 
letti (a meno di fallimento). Se non trova più niente da 
leggere, restituisce 0 e quindi ho finito di "mangiare".
In cosa sbaglio?
grazie e auguri a tutti!


 In cosa sbaglio?
l'errore stà nel fatto che non ritorna 0 se non trova più niente da leggere,
ma si 'blocca' sulla read(), ecco perchè ti consigliavo l'uso di select()
[anche se in questo caso non è strettamente necessario].
Ad esempio se volessi una parola di massimo 9 lettere:
----- taglia qui ----------
fd_set fds;
struct timeval tv;
int n,r;
char s[10], *tmp;
if ((n=read(0,s,9))==9) {
        tmp=(char*)malloc(1024);
        do {
                FD_ZERO(&fds);
                FD_SET(0,&fds);
                tv.tv_sec=0, tv.tv_usec=0;
                if ((r=select(1,&fds,NULL,NULL,&tv))) read(0,tmp,1024);
        } while (r);
        free(tmp);
}
if (n!=-1)
        if (s[n-1]=='\n') s[n-1]='\0'; else s[n]='\0';
else
        perror("Oops, can't read from stdin");
printf("%s\n",s);
------- taglia qui -----------
La select() serve x controllare se ci sono caratteri da leggere dallo stdin.
Invece di complicarti la vita puoi sfruttare il fatto che il buffer dello
stdin è "finito" e quindi l'utente non può inserire più di un certo numero
di caratteri.
Quindi si tratta solo di eseguire una read non di 10 caratteri ma del numero
di caratteri di cui è composto questo buffer (che _credo_ sia di dimensione
BUFSIZ, definito in stdio.h) e copiare nel buffer di 10 solo la parte
iniziale, che è quella che ti interessa.
Ciao.
-- 
none

 _credo_ sia di dimensione BUFSIZ, definito in stdio.h
esatto :)
ciao,
franmau
