Hallo Liebe Forumuser,
ich habe eine Aufgabe fuer die Uni zu bewaeltigen und stecke fest.
ich soll aehnlich wie in
http://cboard.cprogramming.com/c-programming/56439-ascii-art-decoder-encoder.html
einen Dekodierer auf C Basis erstellen, der mir solch verschluesselten
Dateien dekodiert.
Das Programm Soll:
- Benutzer nach Dateinamen fragen.
- Zeilen dieser Datei als Datensätze des dargestellten Kodierers
interpretieren
- Die Daten dekodieren und gibt die verschluesselten Daten dann
entsprechend ihrer Anzahl und Reihenfolge am Bildschirm aus, damit man
das urspruengliche Bild sehen kann.
Danach die Ausgabe nicht nur auf dem Bildschirm sondern zusätzlich in
eine TXT-Datei schreiben.
Die Elemte der Syntax duerfen durch beliebig viel Leerraum getrennt
sein. Dazu zaehlen:
- Leerzeichen
- Tabulatorzeichen
- Neue Zeile Zeichen
Da dann mit der ctype.h Funktion isspace zur Erkennung von
Leerraumzeichen arbeiten.
Tut mir leid fuer das Durcheinander, aber ich bin noch ein Anfaenger.
Es sind noch viele printf's im Programm zur Fehlersuche und ein Test zur
Stringverkettung.
Meine Ausgabe auf der Konsole ist sehr wirr und aber hier meine erste
Zeile der Ausgabe.
Nennen sie den Dateinamen : asterix.caa
8 zn 32abc 24 zn 344abc 3 zn 3422abc 14 zn 34234abc 3 zn 342322abc 81 zn
3423301
Der erste Part stimmt. 8 und " " ein Leerzeichen als Zeichen, jedoch
weiss ich nicht wieso er dann bei 32 ankommt und der Zahlenwert immer
laenger wird. Stimmt was mit dem /0 nicht?
ektoplasma schrieb:> char array[];
Das wird so nichts, woher soll der Compiler wissen, wie viel Speicher er
für dein Array reservieren soll?
> char* e = strtok(array,"=;"); //initialiserung, welche char* array> e = strtok(NULL,"=;"); //bereits initialisiert>> int y = 0;> b=0;> for(y; y<sizeof(e)-2; y++){ //Berechnung Breite
sizeof(e) liefert dir hier die Größe in Bytes des Pointers und nicht die
Länge des Strings, dafür ist strlen da.
Beschäftig dich lieber mal mit den Grundlagen.
ektoplasma schrieb:> Tut mir leid fuer das Durcheinander
Was schon mal viel zu Lesbarkeit beiträgt sind die Code Tags:
Steffen M. schrieb:> Also reserviere ich mir mit malloc einfach meinen Speicher?> array = (int *) malloc(size * sizeof(int));
Dann würde ich array aber mit
1
char*array;
deklarieren.
Den Pointer würde ich auch nach (char*) und nicht nach (int*) casten und
mit der Größe size * sizeof(char) allokieren. Nicht vergessen, den
Speicher am Ende wieder freizugeben.
Wenn du auch mit statischer Größe zurechtkommst, würde ich auf das
malloc verzichten.
Max H. schrieb:> Steffen M. schrieb:>> Also reserviere ich mir mit malloc einfach meinen Speicher?>> array = (int *) malloc(size * sizeof(int));> Dann würde ich array aber mit
1
char*array;
deklarieren.
> Den Pointer würde ich auch nach (char*) und nicht nach (int*) casten und> mit der Größe size * sizeof(char) allokieren. Nicht vergessen, den> Speicher am Ende wieder freizugeben.>> Wenn du auch mit statischer Größe zurechtkommst, würde ich auf das> malloc verzichten.
Soll ich dann einfach mit MAX Größe initialisieren?
Benutzung: ./a.out <asterix.caa
bzw: ./a.out <asterix.caa >ausgabe.txt
Dies soll nur ein Beispiel sein, wie man sowas auf die einfachste Weise
implementieren kann (nicht sollte!). Auch wenn man den Parser schöner
macht, sind komplexe String-Funktionen oder dynamische
Speicherverwaltung nicht nötig. Btw, Kommentare habe ich mit Absicht
weggelassen - klamüser selbst raus, wie/warum das funktioniert, wo
Probleme auftreten und mach es dann besser ;-)
Hier noch eine Lösung in c von mir im Anhang.
Kompilieren mit:
gcc -Wall -Werror -Wextra -pedantic -std=c99 main.c -o main
Verwendung:
main < asterix.caa