Lagerverwaltung - Artikel löschen (doppelt)
-
Guten Morgen,
arbeite an einem Projekt und komme nicht weiter bzw. habe einen Fehler den ich nicht beheben kann.Meine Funktion:
void ArtikelLoeschen() { system("cls"); long eingabe; char auswahl = 'J'; int gefunden = 0; printf("Geben Sie die Artikelnummer ein: "); scanf("%ld", &eingabe); if(head == NULL) { printf("Die Liste ist leer\n"); _getch(); } else { aktuell = head; while(aktuell != NULL) { if(aktuell->Artikelnummer == eingabe) { gefunden = 1; printf("Wollen Sie diesen Artikel:\n\n"); printf("Artikelnummer: %ld\n", aktuell->Artikelnummer); printf("Bezeichnung: %s\n", aktuell->Bezeichnung); printf("Artikelpreis: %.2f\n", aktuell->Preis); printf("Artikelanzahl: %d\n\n", aktuell->Anzahl); printf("wirklich löschen? <J/N>\n"); scanf("%c", &auswahl); if(auswahl == 'J' || auswahl == 'j') { free(aktuell); printf("Artikel wurde gelöscht!"); _getch(); break; } else if(auswahl == 'N' || auswahl == 'n') break; while(auswahl != 'J' || auswahl != 'j' || auswahl != 'N' || auswahl != 'n') { printf("wirklich löschen? <J/N>\n"); scanf("%c", &auswahl); } } aktuell = aktuell->next; } } if (gefunden == 0) { printf("Diese Artikelnummer ist nicht vorhanden."); _getch(); } }
Diese Funktion soll einen Artikel, den ich vorher angelegt habe wieder löschen. Das Programm soll aber vorher fragen, ob wirklich gelöscht werden soll. Wenn Man "J" bzw. "j" eingibt soll er den Artikel löschen. Wenn man "N" bzw. "n", soll er aus der Schleife rausgehen. Wenn man was anderes eingibt soll er nochmal fragen ob gelöscht werden soll, d. h., dass man erst weiter kommt wenn man J oder N eingegeben hat.
Nun zu meinem Problem:
Wenn ich das Programm ausführe und einen Artikel hinzufüge und anschließend versuche ihn wieder zu löschen, muss ich erstmal die Artikelnummer eingeben, anschließend fragt er mich ob ich den Artikel wirklich löschen will. Das Problem ist er gibt es zweimal aus.wirklich löschen <J/N>?
wirklich löschen <J/N>?Ich kann danach noch was eingeben aber er akzeptiert weder "J" noch "N" noch sonst irgendetwas. und gibt mir wieder:
wirklich löschen <J/N>?
wirklich löschen <J/N>?aus.
Der Fehler sollte in diesem Bereich liegen:if(aktuell->Artikelnummer == eingabe) { gefunden = 1; printf("Wollen Sie diesen Artikel:\n\n"); printf("Artikelnummer: %ld\n", aktuell->Artikelnummer); printf("Bezeichnung: %s\n", aktuell->Bezeichnung); printf("Artikelpreis: %.2f\n", aktuell->Preis); printf("Artikelanzahl: %d\n\n", aktuell->Anzahl); printf("wirklich löschen? <J/N>\n"); scanf("%c", &auswahl); if(auswahl == 'J' || auswahl == 'j') { free(aktuell); printf("Artikel wurde gelöscht!"); _getch(); break; } else if(auswahl == 'N' || auswahl == 'n') break; while(auswahl != 'J' || auswahl != 'j' || auswahl != 'N' || auswahl != 'n') { printf("wirklich löschen? <J/N>\n"); scanf("%c", &auswahl); } }
jedoch finde ich nichts.
Hoffe ich habe mich verständlich ausgedrückt und man kann mir schnell helfen.
Danke im voraus.
Bis dahin
-
FreshAC schrieb:
Guten Morgen,
arbeite an einem Projekt und komme nicht weiter bzw. habe einen Fehler den ich nicht beheben kann.Meine Funktion:
void ArtikelLoeschen() { system("cls"); long eingabe; char auswahl = 'J'; int gefunden = 0; printf("Geben Sie die Artikelnummer ein: "); scanf("%ld", &eingabe); if(head == NULL) { printf("Die Liste ist leer\n"); _getch(); } else { aktuell = head; while(aktuell != NULL) { if(aktuell->Artikelnummer == eingabe) { gefunden = 1; printf("Wollen Sie diesen Artikel:\n\n"); printf("Artikelnummer: %ld\n", aktuell->Artikelnummer); printf("Bezeichnung: %s\n", aktuell->Bezeichnung); printf("Artikelpreis: %.2f\n", aktuell->Preis); printf("Artikelanzahl: %d\n\n", aktuell->Anzahl); printf("wirklich löschen? <J/N>\n"); scanf("%c", &auswahl); if(auswahl == 'J' || auswahl == 'j') { free(aktuell); printf("Artikel wurde gelöscht!"); _getch(); break; } else if(auswahl == 'N' || auswahl == 'n') break; while(auswahl != 'J' || auswahl != 'j' || auswahl != 'N' || auswahl != 'n') { printf("wirklich löschen? <J/N>\n"); scanf("%c", &auswahl); } } aktuell = aktuell->next; } } if (gefunden == 0) { printf("Diese Artikelnummer ist nicht vorhanden."); _getch(); } }
Diese Funktion soll einen Artikel, den ich vorher angelegt habe wieder löschen. Das Programm soll aber vorher fragen, ob wirklich gelöscht werden soll. Wenn Man "J" bzw. "j" eingibt soll er den Artikel löschen. Wenn man "N" bzw. "n", soll er aus der Schleife rausgehen. Wenn man was anderes eingibt soll er nochmal fragen ob gelöscht werden soll, d. h., dass man erst weiter kommt wenn man J oder N eingegeben hat.
Nun zu meinem Problem:
Wenn ich das Programm ausführe und einen Artikel hinzufüge und anschließend versuche ihn wieder zu löschen, muss ich erstmal die Artikelnummer eingeben, anschließend fragt er mich ob ich den Artikel wirklich löschen will. Das Problem ist er gibt es zweimal aus.wirklich löschen <J/N>?
wirklich löschen <J/N>?Ich kann danach noch was eingeben aber er akzeptiert weder "J" noch "N" noch sonst irgendetwas. und gibt mir wieder:
wirklich löschen <J/N>?
wirklich löschen <J/N>?aus.
Der Fehler sollte in diesem Bereich liegen:if(aktuell->Artikelnummer == eingabe) { gefunden = 1; printf("Wollen Sie diesen Artikel:\n\n"); printf("Artikelnummer: %ld\n", aktuell->Artikelnummer); printf("Bezeichnung: %s\n", aktuell->Bezeichnung); printf("Artikelpreis: %.2f\n", aktuell->Preis); printf("Artikelanzahl: %d\n\n", aktuell->Anzahl); printf("wirklich löschen? <J/N>\n"); scanf("%c", &auswahl); if(auswahl == 'J' || auswahl == 'j') { free(aktuell); printf("Artikel wurde gelöscht!"); _getch(); break; } else if(auswahl == 'N' || auswahl == 'n') break; while(auswahl != 'J' || auswahl != 'j' || auswahl != 'N' || auswahl != 'n') { printf("wirklich löschen? <J/N>\n"); scanf("%c", &auswahl); } }
jedoch finde ich nichts.
Hoffe ich habe mich verständlich ausgedrückt und man kann mir schnell helfen.
Danke im voraus.
Bis dahinif(aktuell->Artikelnummer == eingabe) {while(1) { gefunden = 1; printf("Wollen Sie diesen Artikel:\n\n"); printf("Artikelnummer: %ld\n", aktuell->Artikelnummer); printf("Bezeichnung: %s\n", aktuell->Bezeichnung); printf("Artikelpreis: %.2f\n", aktuell->Preis); printf("Artikelanzahl: %d\n\n", aktuell->Anzahl); printf("wirklich löschen? <J/N>\n"); scanf("%c", &auswahl); if(auswahl == 'J' || auswahl == 'j') { free(aktuell); printf("Artikel wurde gelöscht!"); _getch(); break; } else if(auswahl == 'N' || auswahl == 'n') break; } }
Vielleicht so?
-
leer mal den puffer vor scanf("%c", &auswahl); mit fflush(stdin). das sollte auf jeden fall die doppelte anzeige
wirklich löschen <J/N>?
wirklich löschen <J/N>?verhindern
-
neo47 schrieb:
leer mal den puffer vor scanf("%c", &auswahl); mit fflush(stdin).
Und nicht vergessen, dem Wolf eine Grußkarte zu schreiben!
-
neo47 schrieb:
leer mal den puffer vor scanf("%c", &auswahl); mit fflush(stdin). das sollte auf jeden fall die doppelte anzeige
wirklich löschen <J/N>?
wirklich löschen <J/N>?verhindern
Eine Grußkarte habe ich nicht, aber ein großes Dankeschön.
Es funktioniert. Danke sehr.
-
neo47 schrieb:
leer mal den puffer vor scanf("%c", &auswahl); mit fflush(stdin). das sollte auf jeden fall die doppelte anzeige
wirklich löschen <J/N>?
wirklich löschen <J/N>?verhindern
ich habe gehört, dass
fflush(stdin)
die CPU zum Schmelzen bringen kann
-
hab ich noch nie gehört und ist bei mir auch noch nie passiert. Hast du einen andere vorschlag??
-
neo47 schrieb:
hab ich noch nie gehört und ist bei mir auch noch nie passiert.
was nicht heißt, dass meine Aussage falsch wäre.
neo47 schrieb:
Hast du einen andere vorschlag??
lies die ganze Zeile mit fgets und parse sie. Das erspart viel Ärger mit dem Löschen von stdin. Irgendwo in ANSI C Forum gibt es von mir ein Bsp, wie man eine getline Fkt schreibt. Ich such sie mal.
-
neo47 schrieb:
hab ich noch nie gehört und ist bei mir auch noch nie passiert. Hast du einen andere vorschlag??
Das Verhalten ist einfach undefiniert, ob du damit einen Atomkrieg auslöst oder was auch immer... Man weiß es nicht
void myFlush() { int c; while ( ( c = getchar() ) != EOF && c != '\n' ); }
-
Eine Grußkarte habe ich nicht, aber ein großes Dankeschön.
Es funktioniert. Danke sehr.Bedank dich doch nicht für den Hinweis auf eine Wolfroutine. Das spielt nur dem Satan in die Hände. Mach's besser so wie ewrwrwer, das wird alle drei Tage gepostet und gilt als probat. Oder nimm setvbuf().