FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Allgemeines

Ausgabe einer Ascii Tabelle in C

Ausgabe einer Ascii Tabelle in C 2012-01-06 16:13
Anonymer User
Hallo,

weiss irgendwer wie man eine Ascii Tabelle in C erstellt.

Das Grundgerüst soll so aussehen (Ascii Code Asci Zeichen):

0 \0 64 @ 128 \128 192 \192
1 \1 65 A 129 \129 193 \193
2 \2 66 B 130 \130 194 \194
…. …… ……….. …………

(1) Der Ascii-Code soll rechtsbündig (s.o.) ausgegeben werden mit maximal 2 führenden Leerzeichen.

(2) ASCII-Zeichen wird rechtsbündig mit 4 führenden Leerzeichen ausgegeben.
Alle ASCII-Zeichen zwischen 33 und 126 sollen ganz normal ausgegeben werden.
Die ASCII-Zeichen, \a, \b, \t, \n, \v, \f, \r werden als solche ausgeben (also 0 - 13). Die Restlichen ASCII-Zeichen sollen (s.o.) mit einem Backslash gefolgt vom ASCII-Code dargestellt werden.

Mein Ansatz war:

#include <stdio.h>
#include <limits.h>

int main()
{
int i, spalte1, spalte2, spalte3, spalte4;
char *trenner = "";

// Zahlen fuer Spalten
while (i <= 255)
{
spalte1 = i;
spalte2 = i+64;
spalte3 = i+128;
spalte4 = i+192;

// 1. Spalte
if(spalte1 >= 0 && spalte1 <= 63)
{
switch(i)
{
case 0: printf("%3d %4s",spalte1,"\\0");
break;
case 1: printf("%3d %4s",spalte1,"\\1");
break;
case 2: printf("%3d %4s",spalte1,"\\2");
break;
case 3: printf("%3d %4s",spalte1,"\\3");
break;
case 4: printf("%3d %4s",spalte1,"\\4");
break;
case 5: printf("%3d %4s",spalte1,"\\5");
break;
case 6: printf("%3d %4s",spalte1,"\\6");
break;
case 7: printf("%3d %4s",spalte1,"\\a");
break;
case 8: printf("%3d %4s",spalte1,"\\b");
break;
case 9: printf("%3d %4s",spalte1,"\\t");
break;
case 10: printf("%3d %4s",spalte1,"\\n");
break;
case 11: printf("%3d %4s",spalte1,"\\v");
break;
case 12: printf("%3d %4s",spalte1,"\\f");
break;
case 13: printf("%3d %4s",i,"\\r");
break;
}
if ((spalte1 >= 14) && (spalte1 <= 32))
{
printf("%3d %s%d",spalte1,"\\",spalte1);
}

if ((spalte1 >= 33) && (spalte1 <= 63))
{
char charsp1 = spalte1;
printf("%3d %4c",spalte1, charsp1);
}
}

// 2. Spalte
if (spalte2 >= 64 && spalte2 <= 127)
{
if (spalte2 != 127)
{
char charsp2 = spalte2;
printf("%13s%3d %4c",trenner,spalte2,charsp2);
}
else
{
printf("%13s%3d %s%d",trenner,spalte2,"\\",spalte2);
}
}

// 3. Spalte && 4. Spalte
if (spalte3 > 128 && spalte4 <= 255)
{
if (spalte3 >= 128 && spalte3 <= 191)
{
printf("%13s%3d %s%d",trenner,spalte3,"\\", spalte3);
}

if (spalte4 >= 192 && spalte4 <= 255)
{
printf("%13s%3d %s%d\n",trenner,spalte4,"\\",spalte4);
}
}
i++;
}
return 0;
}

Sollte eleganter zu lösen sein, weiß aber nicht wie. Auch ist auf diese Weise die 1. Zeile ein wenig verschoben. Kann mir jemand weiterhelfen?

RE: Ausgabe einer Ascii Tabelle in C 2012-01-06 17:06
Fred
Das switch kann man z.B. durch ein Array ersetzen, dann wird es schon ein bischen kompakter.
#include <stdio.h> static const char special[33] = "0123456abtnvfr"; int main() {     int zeile, zeichen;     for (zeile = 0; zeile < 64; ++zeile)     {         for (zeichen = zeile; zeichen < 256; zeichen += 64)         {             printf("%3d", zeichen);             if (zeichen < 33)             {                 if (special[zeichen])                 {                     printf("   \\\\%c", special[zeichen]);                 }                 else                 {                     printf("  \\\\%d", zeichen);                 }             }             else if (zeichen < 127)             {                 printf("    %c", zeichen);             }             else             {                 printf(" \\\\%d", zeichen);             }             printf("        ");         }         printf("\n");     }     return 0; }

RE: Ausgabe einer Ascii Tabelle in C 2012-01-08 13:28
Anonymer User
Vielen Dank.

RE: Ausgabe einer Ascii Tabelle in C 2012-01-08 16:01
Anonymer User
Hab noch ne Frage bezüglich static const char special[33]. Wenn ich stattdessen 14 (arraygröße) nehme bekomme ich wirres Zeug und er greift manchmal auf den if und manchmal auf den else-Teil zu. Was steht denn in special[15] drin? Wieso bewirkt die Arraygrößenbeschränkung auf 33 (und nicht 13)?

RE: Ausgabe einer Ascii Tabelle in C 2012-01-08 16:02
Anonymer User
Was steht dann in special [ 14 ] drin?

RE: Ausgabe einer Ascii Tabelle in C 2012-01-08 16:50
Fred
static const char special[33] = "0123456abtnvfr"; In special[14] steht NUL drin (also das Zeichen mit dem ASCII-Code 0). Genauso in special[15] bis special[32]. Wenn Du bei der Initialisierung eines Arrays weniger Elemente angibst, als die Arraygröße vorgibt, dann werden die restlichen Plätze implizit mit 0 befüllt.
static const char special[14] = "0123456abtnvfr"; Es ist illegal, auf special[14] zuzugreifen, da es nur special[0] bis special[13] gibt. Wenn Du es trotzdem versuchst, kann alles mögliche passieren. Formal bezeichnet der Sprachstandard dies als "Undefiniertes Verhalten".

RE: Ausgabe einer Ascii Tabelle in C 2012-01-08 21:48
Anonymer User
Danke für die Aufklärung.