C, printf, backspace, shell
-
alessandropapi102
- Prode Principiante
- Messaggi: 7
- Iscrizione: lunedì 16 giugno 2014, 17:29
- Desktop: ubuntu-2d
- Distribuzione: Ubuntu 12.04.1 LTS x86_64
C, printf, backspace, shell
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
[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
alessandropapi102 ha scritto:ho realizzato una mia getch...avete qualche soluzione
Ci fai vedere la getch? grazie
- difesaparcosempione
- Rampante Reduce

- Messaggi: 6031
- Iscrizione: giovedì 27 luglio 2006, 19:06
- Località: Torino
- Contatti:
Re: C, printf, backspace, shell
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.alessandropapi102 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4600204#p4600204][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: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
-
alessandropapi102
- Prode Principiante
- Messaggi: 7
- Iscrizione: lunedì 16 giugno 2014, 17:29
- Desktop: ubuntu-2d
- Distribuzione: Ubuntu 12.04.1 LTS x86_64
Re: C, printf, backspace, shell
[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ì...
{
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
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:
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;
}
-
alessandropapi102
- Prode Principiante
- Messaggi: 7
- Iscrizione: lunedì 16 giugno 2014, 17:29
- Desktop: ubuntu-2d
- Distribuzione: Ubuntu 12.04.1 LTS x86_64
Re: C, printf, backspace, shell
Grazie mille, però comunque mi questa getch mi permette di modificare anche precedenti linee nella console, e non solo quella interessata
- difesaparcosempione
- Rampante Reduce

- Messaggi: 6031
- Iscrizione: giovedì 27 luglio 2006, 19:06
- Località: Torino
- Contatti:
Re: C, printf, backspace, shell
???alessandropapi102 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4601714#p4601714][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Grazie mille, però comunque mi questa getch mi permette di modificare anche precedenti linee nella console, e non solo quella interessata
non ho capito il vantaggio ...
ciao
-
alessandropapi102
- Prode Principiante
- Messaggi: 7
- Iscrizione: lunedì 16 giugno 2014, 17:29
- Desktop: ubuntu-2d
- Distribuzione: Ubuntu 12.04.1 LTS x86_64
Re: C, printf, backspace, shell
Ora me lo permette io voglio che questo non accada...
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti
