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
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
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
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

Re: C, printf, backspace, shell

Inviato: mercoledì 18 giugno 2014, 18:05
da alessandropapi102
Ora me lo permette io voglio che questo non accada...