Ein- und Ausgabe (enum)



  • itedvo schrieb:

    [EDIT] 4 Sekunden zu spät ^^

    Dafür aber richtig!
    Ich habe wieder mal das nicht vorhandene & bei scanf übersehen 🙄



  • Es hat nur so lange gedauert weil: ich habs zuerst compiliert bevor ich es
    gepostet habe und weil ich eigentlich seit bald einem jahr nicht mehr ein
    einzelnes Zeichen eingelesen habe und ich strings gewohnt bin, hab ich ebenfalls
    das '&' vergessen und mich gewundert wieso ich jetzt einen Zugriffsfehler erhalte ^^



  • Danke an euch beide!
    Programm läuft nun so, wie es soll 😉



  • Bitteschön =B

    Auch wenn man bedenken muss: Diese Aufgabenstellung ist aus meiner Sicht gesehen
    reiner Schwachsinn. Soetwas würde man keinesfalls so lösen ^^

    eher so (wenn ich es mache ^^):

    typedef char string[50];
    typedef enum{M,W} GESCHLECHT;
    
    int main(void){
    
       GESCHLECHT geschlecht;
       string GS[2]={
        {"Männlich"},
        {"Weiblich"}
       };
       char char_mw=0;
    
       printf("M|W?\n");
       scanf("%c", &char_mw);
    
       if(char_mw == 'M')
          printf("%s", GS[M]);
       else
          if(char_mw == 'W')
             printf("%s", GS[W]);
    
       return 0;
    }
    


  • Bin nun auf ein neues Problem gestoßen:

    typedef enum {M,W}Geschl;
    
    typedef struct
    {
    	int tag;
    	int monat;
    	int jahr;
    }Datum;
    
    typedef struct
    {
    	Datum dat;
    	char Nachname[30];
    	Geschl geschlecht;
    }Person;
    
    void eingabe(Person *per);
    void ausgabe(Person *per);
    
    int main()
    {
    	Person per;
    
    	eingabe(&per);
    	ausgabe(&per);
    
    	getch();
    	return 0;
    }
    
    void eingabe(Person *per)
    {
    	printf("Datum\n");
    	printf("Tag: "); scanf("%d", &per->dat.tag);
    	printf("Monat: "); scanf("%d", &per->dat.monat);
    	printf("Jahr: "); scanf("%d", &per->dat.jahr);
    
    	printf("Nachname: "); scanf("%s", per->Nachname);
    
    	char eingabe;
    	printf("Geschlecht: "); scanf("%c", &eingabe);
    
    	if(eingabe == 'M')
    	{
    		per->geschlecht = M;
    	}
    	else if(eingabe == 'W')
    	{
    		per->geschlecht = W;
    	}
    }
    
    void ausgabe(Person *per)
    {
    	printf("Geburtsdatum: %d.%d.%d", per->dat.tag, per->dat.monat, per->dat.jahr);
    	printf("Nachname: %d", per->Nachname);
    
    	switch(per->geschlecht)
    	{
    	case M:
    		printf("MAENNLICH");
    		break;
    	case W:
    		printf("WEIBLICH");
    		break;
    	}
    }
    

    Fehlermeldung: Run-Time Check Failure #2 - Stack around the variable 'eingabe' was corrupted.



  • - du leerst den Tastaturpuffer nicht
    - du verwendest C99
    - du sicherst bei string-scanf nicht den Größenbereich ab
    - getch() ist Müll


  • Mod

    Wutz schrieb:

    - du leerst den Tastaturpuffer nicht

    Lass ihn doch. Tastaturpuffer leeren ist was für GUI-Schreiber.

    - du verwendest C99

    Lass ihn doch. Nicht jeder benutzt Compiler die seit 10+ Jahren nicht mehr weiter entwickelt werden.

    - du sicherst bei string-scanf nicht den Größenbereich ab
    - getch() ist Müll

    +1.

    @Threadersteller:
    Ändere Zeile 39 zu

    printf("Nachname: "); scanf("%29s ", per->Nachname);
    

    Wobei der Nachname dann aber besser keine Leerzeichen enthalten sollte.



  • Dieser Fehler ist jetzt erstmal beseitigt, danke.

    Jedoch kann ich jetzt das Geschlecht gar nicht mehr eingeben - sobald ich den Nachnamen eingegeben habe, gibt er mir die eingegeben Dinge aus.

    Normalerweise sollte ich vorher noch das Geschlecht eingeben können.



  • Das liegt daran, dass du den Eingabepuffer nicht leerst (wie Wutz schon korrekt bemerkt hatte) und scanf("%c") das verbleibende '\n' liest.
    http://www.c-plusplus.net/forum/39349

    Zudem ist bei der Ausgabe in Zeile 57 das %d durch ein %s zu ersetzen.



  • Perfekt, funktioniert nun - besten Dank an euch!


  • Mod

    Oh, habe vergessen: Mach vor das %c ein Leerzeichen.


Anmelden zum Antworten