Speicherzugriffsfehler, WIederholte eingabe; Problem
-
Hallo,
zuerst möchte ich den QuellCode posten, tut mir Leid wegen der Länge, aber da die ganzen Funktionen mehr oder weniger zusammenhängen und um eventuelle Missverständnisse zu vermeiden zeig ich lieber das komplette Programm:
#include <stdlib.h> #include <stdio.h> #include <string.h> void kopfzeile(FILE* out) { fprintf(out, "************************************\n"); fprintf(out, "* SUPERMARKT *\n"); fprintf(out, "* Berliner Str. 12, 123456 Berlin *\n"); fprintf(out, "* Tel.: 0124 12 34 45 *\n"); fprintf(out, "************************************\n"); fprintf(out, "------------------------------------\n"); fprintf(out, "|Artikelnummer|\tAnzahl|\tEinzelpreis|\n"); fprintf(out, "------------------------------------\n"); } void fusszeile(FILE* out) { fprintf(out, "------------------------------------\n"); fprintf(out, "************************************\n"); fprintf(out, "* Der Supermarkt bedankt sich für *\n"); fprintf(out, "*Ihren einkauf. Wir freuen uns auf *\n"); fprintf(out, "* Ihren nächsten besuch. *\n"); fprintf(out, "* Ihr Supermarkt-Team! *\n"); fprintf(out, "************************************\n"); } void einkauf(FILE* out, char artikelnummer[], char anzahl[], char einzelpreis[]) { fprintf(out, "|%13s|\t%6s|\t%11s|\n", artikelnummer, anzahl, einzelpreis); } void kassenbonDrucken(FILE* f, char artikelnummer[], char anzahl[], char einzelpreis[]) { kopfzeile(f); einkauf(f, artikelnummer, anzahl, einzelpreis); fusszeile(f); } int zerlegen(char eingabe[], char ergebnis[], int anzahl, char trennzeichen, int startindex) { char c = eingabe[startindex]; int qi = startindex; int zi = 0; while (c != trennzeichen) { ergebnis[zi] = c; qi++; zi++; c = eingabe[qi]; } ergebnis[zi] = '\0'; qi++; return qi; } int main(int argc, char* argv[]) { char eingabe[256] = ""; char artikelnummer[64] = ""; char anzahl[64] = ""; char einzelpreis[64] = ""; int weiter = 1; int index = 0; if (argc != 2) { printf("Falsche Anzahl von Kommandozeilenparametern!\n") ; exit(EXIT_FAILURE) ; } if(fopen(argv[1], "r")) { printf("Die Datei %s exisitiert bereits!\n", argv[1]); exit(EXIT_FAILURE); } FILE* out = fopen(argv[1], "w"); if (out == NULL) { printf("Ausgabedatei \"%s\" konnte nicht geoeffnet werden.\n", argv[1]) ; exit(EXIT_FAILURE); } while(weiter == 1) { printf("Bitte geben Sie die Artikelnummer, die Anzahl und den Einzelpreis ein: \n"); fgets(eingabe, 255, stdin); index = zerlegen(eingabe, artikelnummer, 63, ' ', index); index = zerlegen(eingabe, anzahl, 63 ,' ', index); index = zerlegen(eingabe, einzelpreis, 63, ' ', index); kassenbonDrucken(out, artikelnummer, anzahl, einzelpreis); printf("Weiter?\n1 = Ja\t\t2 = Nein\n"); scanf("%d", &weiter); memset(&eingabe[0], 0, sizeof(eingabe)); memset(&artikelnummer[0], 0, sizeof(artikelnummer)); memset(&anzahl[0], 0, sizeof(anzahl)); memset(&einzelpreis[0], 0, sizeof(einzelpreis)); } return EXIT_SUCCESS; }
Das Programm lässt sich kompiliert und auch ausführen, wenn ich nur eine Eingabe mache und dann das Programm mit "2" beende, klappt auch alles.
Wenn ich nun aber noch eine Eingabe machen will kommt es zu einem Speicherzugriffsfehler.Meine Theorie: Dadurch das die Char-Arrays an die Funktion zerteilen übergeben werden, zerfallen sie automatisch zu Pointern, wenn ich nun die char-Array leere, zeigt der Pointer aber auf eine leere Adresse(?).
Es ist logisch, dass bei nur einer Eingabe alles klappt, weil ich dann keine Arrays leeren muss.
Ich weiss nicht genau ob ich mit meiner Theorie richtig liege, noch wie ich das Problem beheben kann.
Ich bedanke mich schonmal für die Zeit die ihr euch genommen habt und hoffe auf hilfreiche Beiträge.
Mit freundlichen Grüßen,
Jerry
-
while (c != trennzeichen)
Hier läufst du evtl. über das Stringende hinaus.
-
Ah, ich habe vergessen zu erwähnen, dass das letzte Zeichen der Eingabe das Trennzeichen sein muss, da es sonst ebenfalls zu einem Speicherzugriffsfehler kommt.
Wenn ich das allerdings beachte, läuft es, bei einer Eingabe, eigentlich Problemlos.
-
Du musst deinen Index vor dem Zerlegen der Artikelnummer auch mal wieder auf 0 stellen.
Da du Arrays hast, kann deren Speicherplatz nicht "verloren gehen" wie das mit malloc/free passieren kann.
Ob du vor und nach jedem Artikel die Kopf- und Fußzeilen haben willst, musst du aber entscheiden.