2013-09-04 13 views
9

Ten program kopiuje dane wejściowe na swoje wyjście, zastępując TAB (\t) przez \t backspace (\b) przez \b. Ale tutaj w moim kodzie nie jestem w stanie odczytać wprowadzanego znaku, gdy wchodzę do backspace, którego nie zastępuję, ponieważ działa zakładka.Zrozumienie zachowania Backspace ( b) w C

Kompilacja z GCC w systemie 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; 
} 

Załóżmy, że jeśli wpisuję vinay (tab) hunachyal

Output:vinay\thunachyal 

Gdybym wpisać vinay (i 1 Backspace)

Output:vina 

Tak moje pytanie brzmi, dlaczego vina\b nie drukuje w tym przypadku?
Czy można wykryć \b i wydrukować \b? jeśli nie co jest powodem

Note: muszę w czasie wykonywania Backspace wejściowego nie zapewniając osobny plik mający \ b

Odpowiedz

7

backspace jest zużywana przez interpreter powłoki, dzięki czemu program będzie nigdy go zobaczyć, również kod jest (lekko) zepsuty, z powodu źle ustawionych aparatów ortodontycznych, nie pomógł mu ubogi wgniecenie.

Oto poprawiona wersja:

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

który działa zgodnie z oczekiwaniami:

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

Czy istnieje sposób na uniknięcie backspace spożywanego przez powłokę bez generowania osobnego pliku, potrzebuję w czasie wykonywania klawisza Backspace –

+0

nawet mój kod działa również Jeśli echo "vinay \ thunachyal \ b" | ./a.out, ale moim zapytaniem jest jakikolwiek sposób na wykrycie backspace w czasie wykonywania programu, ponieważ zakładka działa @runtime podobnie jak w backspace, popraw mnie, jeśli jestem zły. –

+0

@vinayhunachyal Tak, twój program to robi. Kwestią tutaj jest po prostu, jak uzyskać backspace do programu. Użycie 'echo', jak wyżej, wydaje się proste. – trojanfoe

4

Gdybym nie zostały błędnie interpretowane na pytanie, można użyć 'Ctrl-H', aby wysłać Backspace . Korzystanie kod poprawiony trojanfoe jest, po wpisaniu:

vinay^H 

To będzie drukować:

vinay\b 

^H oznacza 'Ctrl-H', to znak ASCII nr 8, która jest Backspace.