2016-08-16 3 views
0
#include <stdio.h> 

int main() { 
    int c; 

    while ((c = getchar()) != EOF) { 
     if (c == '\t') 
      printf("\\t"); 
     else if (c == '\b') 
      printf("\\b"); 
     else if (c == '\\') 
      printf("\\\\"); 
     else 
      putchar(c); 
    } 
    return 0; 
} 

In diesem Fall für eine Eingabe vonC-Programmierung, Kann jemand das erklären?

hi how are you\doing

Ich erhalte eine Ausgabe

hi\thow\tare\tyou\\doing

#include <stdio.h> 

int main() { 
    int c; 

    while ((c = getchar()) != EOF) { 
     if (c == '\t') { 
      c = '\b'; 
      printf("\\t"); 
     } 
     if (c == '\b') { 
      c = '\b'; 
      printf("\\b"); 
     } 
     if (c == '\\') { 
      c = '\b'; 
      printf("\\\\"); 
     } 
     putchar(c); 
    } 
    return 0; 
} 

Wenn ich laufe dieses Programm mit einem Eingang

hi how are you\doing 

(Die großen Räume sind Tabs)

ich diese Ausgabe

hi\t\how\t\are\t\you\doing 

-Code erhalten:

#include <stdio.h> 

int main() { 
    int c; 
    c = '\b'; 
    putchar(c); 
    return 0; 
} 

On läuft dies, ich nichts. Keine Leistung. Zurück zur Shell-Eingabeaufforderung.

Genauer gesagt, im ersten Programm mir die Ausgabe Ich möchte, aber im zweiten Programm bekomme ich die Schrägstriche nach jedem \t aber nicht nach den \ würde ich \\\ erwarten, dass der Ausgang bei der Suche sein, wie \t wurden \t\, verursacht '\ b' das? Wenn ja, wie funktioniert es? Aber wenn ja, warum geschieht das nicht auch im dritten Programm?

lief dies auf rasbian Standard-GCC-Compiler und Mingw msys-gcc-Paket für Windows.

+2

' '\ b'' ist "Rücktaste". Also bekommst du nichts. –

+0

Ja, aber im Fall der ersten Ausgabe, bekomme ich ein "\" nach "\ t" und wenn es "\\" drucken soll, druckt es einfach "\" – user6723034

+3

'\\ 'ist ein * escape * . Normalerweise ist die Single '\ '' Teil einer * Escape-Sequenz * wie '\'. Wenn Sie einen doppelten Schrägstrich setzen, wird die Flucht beendet und ein einzelner Schrägstrich als tatsächlicher Ausdruck ausgegeben. Ähnlich mit '"% "' in 'printf', was normalerweise eine Formatangabe bedeutet. Wenn Sie wirklich ein Prozentzeichen wollen, müssen Sie '' %% '' setzen, um die erwartete Sequenz zu besiegen. –

Antwort

2

Der Grund das zweite Programm wird auf diese Weise zu verhalten, weil Sie mehr als ein if Block eingeben:

if (c == '\t') { 
     c = '\b'; 
     printf("\\t"); 
    } 
    if (c == '\b') { 
     c = '\b'; 
     printf("\\b"); 
    } 
    if (c == '\\') { 
     c = '\b'; 
     printf("\\\\"); 
    } 
    putchar(c); 

Wenn Sie eine Registerkarte auftreten, wird der erste Block eingegeben, wo es \t auf dem Bildschirm ausgibt dann ändert c in eine Rücktaste.

Der zweite Block wird dann eingegeben, weil c eine Rücktaste ist (weil Sie es gerade so geändert haben). Dieser Block druckt dann \b auf den Bildschirm, so dass Sie jetzt \t\b auf dem Bildschirm haben. Wenn Sie dann putchar aufrufen, um die Rücktaste zu schreiben, wird die b durch das nächste Zeichen überschrieben. Wenn das nächste Zeichen geschrieben wird, haben Sie dann \t\ auf dem Bildschirm.

Das Problem hier ist also, dass Sie c mehrere Male testen und es möglicherweise zwischendurch ändern. Der Grund, warum dies nur mit der Registerkarte geschieht, liegt darin, dass Sie zuerst nach der Registerkarte, dann nach der Rücktaste und dann nach dem umgekehrten Schrägstrich suchen.

Wenn Sie else if statt if verwenden, werden Sie nicht mehrere Blöcke eingeben:

if (c == '\t') { 
    c = '\b'; 
    printf("\\t"); 
} 
else if (c == '\b') { 
    c = '\b'; 
    printf("\\b"); 
} 
else if (c == '\\') { 
    c = '\b'; 
    printf("\\\\"); 
} 
putchar(c); 

Mit dieser Änderung der ursprünglichen Eingabe gegeben, wird der Ausgang sein:

hi\how\are\you\doing 
+0

Danke, das war unglaublich! Ich kann jetzt endlich schlafen. – user6723034

Verwandte Themen