Pagina 1 di 1
C, printf, backspace, shell
Inviato: lunedì 16 giugno 2014, 17:51
da alessandropapi102
Sto realizzando una piccolo interprete per cimentarmi nell'utilizzo degli stack etc. Non riesco a simulare il backspace della stringa passata da stdin. Ecco il codice
[code2=cpp]int main()
{
char buf;
while( buf != 10 )
{
buf=getch();
if ( buf == 127 || buf == 8 )
{
printf("\b");
}
else printf("%c", buf); //10 newline, 127 backspace
}
return 0;
}[/code2]
ho realizzato una mia getch...avete qualche soluzione
Re: C, printf, backspace, shell
Inviato: lunedì 16 giugno 2014, 19:38
da ixamit
alessandropapi102 ha scritto:ho realizzato una mia getch...avete qualche soluzione
Ci fai vedere la getch? grazie
Re: C, printf, backspace, shell
Inviato: martedì 17 giugno 2014, 13:09
da difesaparcosempione
Backspace, Delete, and Control-C, etc, can not be read by getchar, as they are processed by the operating system before the line of input is made available to user programs.
Re: C, printf, backspace, shell
Inviato: mercoledì 18 giugno 2014, 13:10
da alessandropapi102
[code2=cpp]char getch()
{
char buf=0;
struct termios old={0};
fflush(stdout);
if(tcgetattr(0, &old)<0)
{
perror("tcsetattr()");
}
old.c_lflag&=~ICANON;
old.c_lflag&=~ECHO;
old.c_cc[VMIN]=1;
old.c_cc[VTIME]=0;
if(tcsetattr(0, TCSANOW, &old)<0)
{
perror("tcsetattr ICANON");
}
if(read(0,&buf,1)<0)
{
perror("read()");
}
old.c_lflag|=ICANON;
old.c_lflag|=ECHO;
if(tcsetattr(0, TCSADRAIN, &old)<0)
{
perror ("tcsetattr ~ICANON");
}
return ( buf );
}[/code2]
#include <unistd.h>
#include <termios.h>
L'ho trovata così...
Re: C, printf, backspace, shell
Inviato: mercoledì 18 giugno 2014, 14:24
da ixamit
un paio di cose veloci perché non ho tempo:
1) il settaggio ICANON | ECHO sulla porta devi farlo al livello superiore, ricordandoti di salvare le impostazioni corrente (per poi ripristinarle in uscita)
2) aggiungere una fflush in uscita se vuoi stampare il carattere senza la newline
il tuo codice corretto:
Codice: Seleziona tutto
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
char getch()
{
char buf=0;
if(read(0,&buf,1)<0)
{
perror("read()");
}
return ( buf );
}
int main()
{
struct termios old,new;
char buf;
if(tcgetattr(0, &old)<0)
{
perror("tcgetattr()");
}
new = old;
new.c_lflag&=~ICANON;
new.c_lflag&=~ECHO;
new.c_cc[VMIN]=1;
new.c_cc[VTIME]=0;
if(tcsetattr(0, TCSANOW, &new)<0)
{
perror("tcsetattr ICANON | ECHO");
}
while( buf != 10 )
{
buf=getch();
if ( buf == 127 || buf == 8 )
{
printf("\b");
}
else printf("%c", buf); //10 newline, 127 backspace
fflush (stdout);
}
if(tcsetattr(0, TCSANOW, &old)<0)
{
perror("tcsetattr OLD");
}
return 0;
}
Re: C, printf, backspace, shell
Inviato: mercoledì 18 giugno 2014, 17:49
da alessandropapi102
Grazie mille, però comunque mi questa getch mi permette di modificare anche precedenti linee nella console, e non solo quella interessata
Re: C, printf, backspace, shell
Inviato: mercoledì 18 giugno 2014, 18:02
da difesaparcosempione
???
non ho capito il vantaggio ...
ciao
Re: C, printf, backspace, shell
Inviato: mercoledì 18 giugno 2014, 18:05
da alessandropapi102
Ora me lo permette io voglio che questo non accada...