2013-09-04 18 views
9

Questo programma copia l'input in uscita, sostituendo TAB (\t) per \t backspace (\b) entro il \b. Ma qui nel mio codice non riesco a leggere il carattere di input quando inserisco backspace, non sostituendolo come una tabulazione funziona.Comprendere il comportamento backspace ( b) in C

compilazione con GCC in Linux:

#include<stdio.h> 
int main(void) 
{ 
    int c=0; 
    while((c=getchar())!=EOF){ 
    if(c=='\t'){ 
     printf("\\t"); 
    if(c=='\b') 
     printf("\\b"); 
    } 
    else 
    putchar(c); 
} 
return 0; 
} 

Supponiamo che se digito Vinay (scheda) hunachyal

Output:vinay\thunachyal 

Se digito Vinay (e 1 backspace)

Output:vina 

Così la mia domanda è perché vina\b non sta stampando in questo caso?
È possibile rilevare \b e stampare \b? se non che cosa è la ragione

Note: ho bisogno in fase di esecuzione backspace ingresso tempo non fornire file separato con \ b

risposta

7

Il backspace è consumato dal interprete di shell, in modo che il programma non potrà mai vederlo, anche il codice è (leggermente) rotto, a causa di parentesi errate, non aiutato dalla scarsa indentazione.

Ecco una versione corretta:

#include<stdio.h> 
int main(void) 
{ 
    int c=0; 
    while((c=getchar())!=EOF){ 
     if(c=='\t') 
      printf("\\t"); 
     else if(c=='\b') 
      printf("\\b"); 
     else 
      putchar(c); 
    } 
    putchar('\n'); 
    return 0; 
} 

che funziona come previsto:

$ echo 'vinay\thunachyal\b' | ./escape 
vinay\thunachyal\b 
+0

C'è un modo per evitare il backspace mangiato dalla shell senza generare file separato, ho bisogno in fase di esecuzione del tasto backspace –

+0

anche il mio codice funziona anche se io echo 'vinay \ thunachyal \ b' | ./a.out, ma la mia query è un modo per rilevare backspace in fase di esecuzione del programma mentre la scheda sta funzionando come il backspace, correggimi se sbaglio. –

+0

@vinayhunachyal Sì, il tuo programma lo sta facendo. Il problema qui è semplicemente come si ottiene il backspace per il programma. Usando 'echo', come sopra sembra un approccio semplice. – trojanfoe

4

Se non ho interpretato erroneamente la domanda, è possibile utilizzare 'Ctrl-H' per inviare un backspace . Utilizzando il codice corretto di trojanfoe, quando si digita:

vinay^H 

verrà stampata:

vinay\b 

^H significa 'Ctrl-H', è ASCII carattere # 8, che è backspace.

Problemi correlati