Bene, il problema è questo: perché scanf accetti un input è necessario premere INVIO; così facendo, però, il cursore va capo. Come fare perché non vada a capo?
P.S.: in tutto il web (così sembra da google) non c'è chi sappia rispondere
Moderatore: Staff



In tutto il web forse ci sono molti che non capiscono che vuoi dire, ma che nessuno che sappia rispondere mi sembra stranomechanicus ha scritto:...P.S.: in tutto il web (così sembra da google) non c'è chi sappia rispondere


Non è così semplice, si deve modificare il comportamento del terminale, in questi casi si dovrebbero usare le curses.phobos3576 ha scritto:...La funzione scanf non è molto adatta per fare queste cose; puoi usare, ad esempio, la funzione getch().

Cfr.spina ha scritto:In tutto il web forse ci sono molti che non capiscono che vuoi dire, ma che nessuno che sappia rispondere mi sembra stranomechanicus ha scritto:...P.S.: in tutto il web (così sembra da google) non c'è chi sappia rispondere. Cosa vuoi fare? Perchè io sono fra quelli che non ha capito!

La soluzione bell'è pronta sono le cursesmechanicus ha scritto:...Ad ora sto valutando una soluzione basata su getchar, sebbene confidassi in una più bell'e pronta.


Te l'ho detto che non era così semplice, è il terminale che devi modificare. Un esempio? Ad esempio potresti leggerti il manuale delle cursesmechanicus ha scritto:le curses... so cosa sono, nulla più. pensavo di aggiungerle, forse, in un secondo momento (ma anche no).
comunque, puoi farmi un esempio?
P.S.: getchar non va.



Codice: Seleziona tutto
/*
* Questo e' un esempio di un programma che legge 5 caratteri dall'input
* e gli analizza prima di stamparli sul terminale, in questo esempio
* i newline non vengono inviate cossicché anche se l'utente preme
* invio, il programma non va a capo.
*/
#include <stdio.h>
#include <string.h>
#include <termios.h>
int main ()
{
int i, a;
struct termios new, old;
tcgetattr(0,&old); /* Prelevo il settaggio corrente */
memcpy(&new, &old, sizeof(struct termios));
new.c_lflag &= ~(ICANON | ECHO); /* Disabilito il modo canonico e l'echo */
new.c_cc[VMIN]=1; /* Setto il minimo numero di caratteri a 1 */
tcsetattr(0,TCSANOW,&new); /* Setto il nuovo termios, subito(TCSANOW) */
for ( i = 0; i < 5; i++ )
{
a=getchar(); /* Prelevo un carattere dall'input standard */
if ( a != '\n')
putchar(a);
}
tcsetattr(0,TCSANOW, &old); /* Ripristino i settaggi originali */
return 0;
}