Fehlermeldung bei Code aus "C-Programmierung/Wikibooks"
-
Hallo,
zur Zeit lese ich bei Wikibooks das Buch "C-Programmierung" - (bin absoluter Anfänger was Programmierung betrifft)Habe nun folgenden Code in den Editor bei Visual Studio kopiert (und soweit auch verstanden - hatte ich zumindest gedacht
)
Addition, usw. funktioniert auch - kein Problem;
aber bei Buchstabe b (zum beenden) kommt ne Fehlermeldung:
Run-Time Check Failure #2 - Stack around the variable 'auswahl' was corrupted.
was bedeutet das?#include <stdio.h> int main(void) { double zahl1, zahl2; char auswahl; printf("\nMini-Taschenrechner\n"); printf("-----------------\n\n"); do { printf("\nBitte geben Sie die erste Zahl ein: "); scanf("%lf", &zahl1); printf("Bitte geben Sie die zweite Zahl ein: "); scanf("%lf", &zahl2); printf("\nZahl (a) addieren, (s) subtrahieren, (d) dividieren oder (m) multiplizieren?"); printf("\nZum Beenden wählen Sie (b) "); scanf("%s",&auswahl); switch(auswahl) { case 'a' : case 'A' : printf("Ergebnis: %lf", zahl1 + zahl2); break; case 's' : case 'S' : printf("Ergebnis: %lf", zahl1 - zahl2); break; case 'D' : case 'd' : if(zahl2 == 0) printf("Division durch 0 nicht möglich!"); else printf("Ergebnis: %lf", zahl1 / zahl2); break; case 'M' : case 'm' : printf("Ergebnis: %lf", zahl1 * zahl2); break; case 'B' : case 'b' : break; default: printf("Fehler: Diese Eingabe ist nicht möglich!"); break; } } while(auswahl != 'B' && auswahl != 'b'); return 0; }
wäre nett, wenn sich jemand kurz Zeit für mich nehmen könnte
-
Lass am besten alles stehen und liegen und besorge dir ein richtiges Lehrbuch (nicht "C von A bis Z"). Wikibooks kannst du vergessen.
Dein unmittelbares Problem kannst du lösen, indem du in Zeile 18 %c statt %s als Formatspezifizierer angibst.
-
@ Bashar
erstmal Danke;
habe aber leider schlechte Nachricht für dich -
Fehlermeldung: "Fehler: Diese Eingabe ist nicht m(ö)glich!"
-
Mach noch ein Leerzeichen vor das
%c
in der besagten Zeile. Also" %c"
Und das sind nun schon zwei gute Gründe, warum du Bashars guten Rat vonwegen der Bücher befolgen solltest. Willst du wirklich von jemandem lernen, der gleich zwei solche Anfängerfehler in einem Anfängerprogramm macht? Den genannten Fehler habe ich gerade editiert, aber beim nächsten Programmbeispiel sind bestimmt wieder welche.
-
@ SeppJ
suuper - funktioniert!ok - ihr habt mich überzeugt
hätte nicht gedacht, dass wikibooks so "schlampig" ist - sind doch über 100 Autoren, sollte doch eigentlich für "Qualität" stehen. Liest sich als Anfänger eigentlich toll - werde das in nächster Zeit nur noch überfliegen und basta.Habe noch folgende Bücher im Regal
- Grundkurs C von J. Wolf (2010) (Autor wird hier nicht gelobt)
- C von H. Erlenkötter (2006) (wollte ich dann als nächstes durcharbeiten)
- C von S. Heitsiek (2002)
- C von P. u. U. Prinz (2005) (hatte ich als erstes gekauft, kurz reingeschaut und gleich beiseite gelegt, war mir viiiel zu schwer)nochmal Danke
tolles Forum; werde euch noch öfters auf die Nerven gehen!
-
Für den Anfang reicht es sich ein(!) gutes Buch zu kaufen. Wenn du es durchgearbeitet hast, kannst du dich weiter umschauen.
Das hin und herspringen zwischen verschiedenen Büchern ist sehr hinderlich für das Lernen und Vorankommen.
-
SeppJ schrieb:
Mach noch ein Leerzeichen vor das
%c
in der besagten Zeile. Also" %c"
Hallo,
entschuldigt die vll. dumme Frage: Warum wird das Leerzeichen benötigt?
Ich habe festgestellt, dass das Programm ohne in der Tat nicht funktioniert, aber dass es erforderlich ist, ist mir gänzlich neu und erschliesst sich mir leider auch hier nicht.
Gruß
Schock
-
Außer vor %c,%[],%n werden von *scanf alle aktuell vorliegenden Whitespaces übergangen, ein " %c" entfernt also alle evtl. an der aktuellen Stelle im Eingabepuffer vorliegenden Whitespaces, wozu auch (wie in diesem Fall) '\n' gehört, und liest dann erst ein Zeichen ein, sonst würde z.B. das '\n' als Zeichen gelesen werden. (ist dokumentiert so im Standard oder Drafts oder kompetenter Fachliteratur)
Ist aber auch nur unzureichend, versuche mal, bei deiner Fließkommazahl "aus Versehen" einen Buchstaben mit einzugeben, dann ist das Programm auch wieder Schrott.
Also wenn, dann gleich richtig, d.h. nach jeder Nutzereingabe von stdin immer den Eingabepuffer vollständig und standardkonform löschen.
Wie das geht, steht hier in den FAQ und in kompetentem Lehrmaterial.