C, printf, backspace, shell

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
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

Messaggio 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
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: C, printf, backspace, shell

Messaggio da ixamit »

alessandropapi102 ha scritto:ho realizzato una mia getch...avete qualche soluzione

Ci fai vedere la getch? grazie
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: C, printf, backspace, shell

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

Messaggio 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ì...
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: C, printf, backspace, shell

Messaggio 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;
}
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

Messaggio da alessandropapi102 »

Grazie mille, però comunque mi questa getch mi permette di modificare anche precedenti linee nella console, e non solo quella interessata
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: C, printf, backspace, shell

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

Messaggio da alessandropapi102 »

Ora me lo permette io voglio che questo non accada...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti