2009-07-03 12 views
5

Ich schreibe ein Programm, das einen Hex-Dump seiner Eingabe druckt. Es treten jedoch Probleme auf, wenn Zeilenumbrüche, Tabulatoren usw. übergeben werden und meine Ausgabeformatierung zerstört wird.Wie wird ' n' anstelle eines Zeilenumbaus gedruckt?

Wie kann ich printf (oder cout schätze ich) verwenden, um '\ n' zu drucken, anstatt einen tatsächlichen Zeilenumbruch zu drucken? Muss ich dafür nur etwas manuell analysieren?

EDIT: Ich erhalte meine Daten dynamisch, es ist nicht nur das, über das ich bin, sondern alle Symbole. Zum Beispiel ist dies meine printf Anweisung:

printf("%c", theChar); 

Wie kann ich diesen Druck \ n machen, wenn ein Newline in als theChar geben wird, aber es immer noch normalen Text machen drucken, wenn theChar ein gültiges druckbare Zeichen ist?

+1

Bedenken Sie, dass es keinen Weg gibt, einen einzigen Aufruf von printf ("% c", foo) kann Ausgabe \ n, eine Zeichenfolge aus zwei Zeichen. Sie müssen grundsätzlich wählen, ob Sie die Eingabe ändern ("\ n" durch "\\ n" ersetzen) oder ein gutes altmodisches if (theChar == '\ n'). – ojrac

Antwort

36

Drucken "\\ n" - "\\" erzeugt "\" und dann wird "n" als gewöhnliches Symbol erkannt. Für weitere Informationen siehe here.

6

Sie können den Backslash, um es nur einen normalen Schrägstrich drucken zu lassen: "\\n".

Edit: Ja, was Sie tun müssen, um eine manuelle Analyse. Allerdings wäre der Code, um dies zu tun, nur eine Suche und ersetzen.

8

Verwenden Sie einfach "\\ n" (zwei Schrägstriche)

4
printf("\\n"); 
1

Nur String::replace verwenden die beanstandeten Zeichen zu ersetzen, bevor Sie printf aufrufen.

Sie könnten die printf wickeln, so etwas zu tun:

void printfNeat(char* str) 
{ 
    string tidyString(str); 
    tidyString.replace("\n", "\\n"); 
    printf(tidyString); 
} 

... und fügen Sie einfach zusätzliche Aussagen ersetzen Sie sich von anderen unerwünschten Zeichen zu befreien.

[Bearbeiten] oder wenn Sie Argumente verwenden möchten, versuchen Sie dies:

void printfNeat(char* str, ...) 
{ 
    va_list argList; 
    va_start(argList, msg); 

    string tidyString(str); 
    tidyString.replace("\n", "\\n"); 
    vprintf(tidyString, argList); 

    va_end(argList); 
} 
+0

So funktioniert std :: basic_string :: replace nicht. Unter http://en.cppreference.com/w/cpp/string/basic_string/replace sehen wir, dass replace 'den Teil des Strings ersetzt, der entweder durch [pos, pos + count] oder [first, last) mit angezeigt wird eine neue Zeichenfolge. Es sucht nicht nach der ursprünglichen Zeichenfolge und ersetzt gefundene Vorkommen. – Jon

22

Die Funktion printchar() unten werden einige Zeichen als „special“, drucken und den Oktal-Code für Zeichen außerhalb des Bereichs drucken (a la Emacs), aber ansonsten normale Charaktere drucken. Ich nahm mir auch die Freiheit, '\n' drucken Sie eine echte '\n' nach, um Ihre Ausgabe lesbarer zu machen. Beachten Sie auch, dass ich eine int in der Schleife in main nur in der Lage, über den gesamten Bereich von unsigned char iterieren kann. In Ihrer Verwendung hätten Sie wahrscheinlich nur eine unsigned char, die Sie aus Ihrem Dataset gelesen haben.

#include <stdio.h> 

static void printchar(unsigned char theChar) { 

    switch (theChar) { 

     case '\n': 
      printf("\\n\n"); 
      break; 
     case '\r': 
      printf("\\r"); 
      break; 
     case '\t': 
      printf("\\t"); 
      break; 
     default: 
      if ((theChar < 0x20) || (theChar > 0x7f)) { 
       printf("\\%03o", (unsigned char)theChar); 
      } else { 
       printf("%c", theChar); 
      } 
     break; 
    } 
} 

int main(int argc, char** argv) { 

    int theChar; 

    (void)argc; 
    (void)argv; 

    for (theChar = 0x00; theChar <= 0xff; theChar++) { 
     printchar((unsigned char)theChar); 
    } 
    printf("\n"); 
} 
+2

+1: Gute Idee auf der < 20 and > 127 catch –

+3

Sollte <32 (oder 0x20) und> = 127 sein. Auch für% o müssen Sie den Char auf unsigned char (oder & 0xff) casten, da char in der Regel signiert ist. – mark4o

+0

Danke @ Mark4o, du hast recht über die 0x20 und die 32. Behoben meine Antwort. –

5

Wenn Sie sicherstellen möchten, dass Sie keine nicht-druckbare Zeichen gedruckt werden kann, dann können Sie die Funktionen nutzen in ctype.h wie isprint:

if(isprint(theChar)) 
    printf("%c", theChar) 
else 
    switch(theChar) 
    { 
    case '\n': 
    printf("\\n"); 
    break; 
    ... repeat for other interesting control characters ... 
    default: 
    printf("\\0%hho", theChar); // print octal representation of character. 
    break; 
    } 
3

Zusätzlich zu den bereitgestellten Beispiele von andere Leute, sollten Sie sich die Zeichenklassifikationsfunktionen wie isprint() und iscntrl() ansehen. Diese können verwendet werden, um zu erkennen, welche Zeichen druckbar sind oder nicht, ohne Hex-Werte aus einer ASCII-Tabelle fest codieren zu müssen.

3

In C/C++ ist das Zeichen '\' als Escape-Zeichen reserviert. Wenn Sie also ein '\' drucken wollen, müssen Sie '\' eingeben. So drucken Sie die aktuellen ‚\ n‘ Wert Sie folgende drucken würde:

printf("\\n"); 
-2

Es gibt drei Lösungen für diese Frage:

Lösung 1: Jedes Symbol, Zahl, Alphabet verfügt über einen eigenen ASCII-Wert . Der ASCII-Wert von '\' als 92 und 'n' als 110. Die unmittelbaren Werte (Numbers (ASCII)) werden in zwei ganzzahligen Variablen gespeichert. Während des Druckvorgangs wird der Formatbezeichner% c (Zeichen) verwendet.

void main() { 
    int i=92, j=110; 
    clrscr(); 
    printf("%c%c", i, j); 
    getch(); 
} 

es in Ihrer C-Programmiersoftware ausprobieren ...

Lösung 2:

Die Programme funktionieren. Aber ich denke, das ist nicht fair ... Am Ausgang Bildschirm, geben Sie den Eingang als \ n ... Sie einen anderen \ bekommen n ..

void main() { 
    char a[10]; 
    gets(a); 
    printf("\n\n\n\n"); 
    puts(a); 
    getch(); 
} 

Probieren Sie die Programme aus

Lösung 3: bereits oben erwähnt Verwendung \ n

0

Ab C 11 ++ Sie auch rohe Strings

std::printf(R"(\\n)"); 

alles in derverwenden könnenund )" werden wörtlich gedruckt. Escape-Sequenzen werden nicht verarbeitet.

Verwandte Themen