Kompletten Dump eines char*
-
Hi,
gibt es eine Möglichkeit, um einen String einfach mit Boardmitteln in eine Zeile einer Shell zu dumpen und zwar inklusive aller Steuerzeichen, es soll sozusagen jedes Zeichen aus der ASCII-Tabelle entsprechend ausmaskiert angezeigt werden.
Ich möchte z.B. nicht einen Zeilenumbruch haben, sondern in der Konsole lesen "\n". Muß man dies alles manuell irgendwie maskieren, oder gibt es da optionen für printf oder ähnliches?
danke
-
Ich würde mal sagen, dass das nicht ohne Weiteres geht. Zeichen wie das LineFeed sind nunmal nicht druckbar, und "\n" ist ja nur ein Entgegenkommen des Compilers, damit wir nicht jedes mal "(char)10" schreiben müssen. Also wirst du eine Funktion schreiben müssen...
-
void dump(char *p) { while (*p) printf("\\x%x", *p++); }
-
GmbH schrieb:
.. Muß man dies alles manuell irgendwie maskieren...
Ja.
for ( i = dings, bis i = bums, i+= mehr )
...
if ( i gleich zehn ) printf("%s", "'\\n'" );
-
if ( i gleich zehn ) printf("%s", "'\\n'" );
-
for(i=0;i<256;i++) { switch(i) { case 10: printf("%s","\\n"); case 13: printf("%s","\\r"); case 27: printf("%s","ESC"); //... default: printf("%i",i); } }
-
GmbH schrieb:
Muß man dies alles manuell irgendwie maskieren
Yes.
-
Muß man dies alles manuell irgendwie maskieren
Um Gottes Willen, Nein! Siehe oben. Dann hast du eben "\x0d" statt "\n". Aber printf würde es auch so verstehen.
Du kannst ctype.h zur Hilfe nehmen, um zumindest Zahlen und Buchstaben vom Maskieren auszuschließen:
include <ctype.h> // isgraph() void dump(char *p) { for (; *p; p++) printf(isgraph(*p) ? "\\x%x" : "%c", *p); }
Die Handvoll Zeichen, die einen "Kurzcode" wie \n oder \t haben, kannst du dann immer noch abfangen. Sehe aber die Notwendigkeit dazu nicht.
-
"Zahlen und Buchstaben" ist Blödsinn; isgraph() prüft auf Darstellbarkeit.
-
flamer schrieb:
[Dann hast du eben "\x0d" statt "\n"...
lesen will geübt sein, extra für dich eine kleine leseübung, ( nicht so schwer ):
GmbH schrieb:
... sondern in der Konsole lesen "\n" ...
flamer schrieb:
Sehe aber die Notwendigkeit dazu nicht.
der threadersteller aber offensichtlich schon.
-
Da war noch eine fehlerhafte Negation im printf.
Richtig wär es so:#include <ctype.h> void dump(const char *p) { for (; *p; p++) { if (isgraph(*p)) putchar(*p); else switch (*p) { case '\n': printf("\\n"); break; case '\t': printf("\\t"); break; case '\r': printf("\\r"); break; case '\f': printf("\\f"); break; case '\v': printf("\\v"); break; case ' ': printf(" "); // das ist alles, was man 'händisch' maskieren muss default: printf("\\x%x", *p); } } }
Dafür hab ich mir ein Bier verdient, oder?
-
break, break, break!
-
du hast das anliegen vom threadersteller noch nicht vollständig kapiert, bist aber sehr nah dran