c newbie sucht hilfe



  • moin!

    wir haben gerade an der uni mit c angefangen... als absoluter newbie stellen sich mir einige fragen.

    als aufgabe sollen wir nach und nach ein addressprogramm erstellen. ich habe meinen bisherigen code aufgelistet.

    die menüauswahl erledige ich über scanf... ich sitze zur zeit an der eingabe von neuen namen... irgendwie klappt das was nicht denn sobald ich return gedrückt habe lande ich wieder im menü... woran liegt das...???

    etwas sehr kryptisch erklärt... am besten den code einfach mal durch den compiler jagen und selbst anschauen.

    habe keine ahnung woran es liegen kann...

    bin für jede hilfe dankbar...
    thanks

    axel

    ----->>>>

    #include <stdio.h> //ANSI-C Library
    #include <conio.h> //keine ANSI-C Library, Sun oder Linux nicht verfügbar

    /*Variablen*/
    char auswahl;
    char abbruch;
    int x;

    /*Funktionen Aufruf*/
    void menue(void);
    void clearscreen(void);

    void deingabe(void); //Datei eingeben
    void dausgabe(void); //Datei ausgeben
    void dspeichern(void); // Datei speichern
    void dsuchen(void); //Datei suchen
    void dloeschen(void); //Datei loeschen
    void dauswaehlen(void); //Datei auswaehlen
    void dbeenden(void); //Datei beenden

    /*Funktionen*/

    void clearscreen(void) //Bildschirm loeschen
    {
    clrscr();
    }

    void deingabe(void) //Datei eingeben
    {
    clearscreen();
    char name;
    printf("\nName:");
    scanf("%d",&name);

    printf("\n\nSie gaben%d ein\n", name);

    /*
    printf("\n\t\t\t*****************************\n");
    printf("\t\t\t***** Teilnehmereingabe \n");
    printf("\t\t\t
    ************************\n");
    printf("\n\n\t\t\tName: ");
    printf("\n\n\t\t\tVorname: ");
    printf("\n\n\t\t\tAbteilung: ");
    printf("\n\n\t\t\tRufnummer: ");
    printf("\n\n\n\n\n\n\n\n\t\t\t! Taste druecken fuer Menue !");
    getch();
    */
    }

    void dausgabe(void) //Datei ausgeben
    {
    clearscreen();
    printf("\n\t\t\t******************************\n");
    printf("\t\t\t***** Telefonverzeichnis \n");
    printf("\t\t\t
    *************************\n");
    printf("\n\n\t\t\tGesuchtes Telefonverzeichnis\n");
    printf("\n\n\n\n\n\n\n\n\t\t\t! Taste druecken fuer Menue !");
    getch();
    }

    void dspeichern(void) //Datei speichern
    {
    clearscreen();
    printf("\n\n\n\n\n\t\t Das Telefonverzeichnis wurde gespeichert\n\n");
    printf("\n\n\n\n\n\n\n\n\t\t\t! Taste druecken fuer Menue !");
    getch();
    }

    void dsuchen(void) //Datei suchen
    {
    clearscreen();
    printf("\n\t\t\t***************************\n");
    printf("\t\t\t***** Teilnehmersuche \n");
    printf("\t\t\t
    **********************\n");
    printf("\n\n\t\t\tTeilnehmer: ");
    getch();
    }

    void dloeschen(void) //Datei loeschen
    {
    clearscreen();
    printf("\n\t\t\t****************************\n");
    printf("\t\t\t**** Teilnehmer loeschen \n");
    printf("\t\t\t
    *************************\n");
    printf("\n\n\t\t\tTeilnehmer: ");
    getch();
    }

    void dbeenden(void) //Programm beendenvoid dbeenden(void) //Programm beenden
    {
    clearscreen();
    printf("\n\t\t***************************************************\n");
    printf("\t\t**** Wollen Sie das Programm wirklich beenden? \n");
    printf("\t\t
    'j' oder 'n' und druecken Sie ENTER \n");
    printf("\t\t
    ***********************************************\n\n");

    printf("\n\t\tAuswahl: ");
    scanf("%s",&auswahl);

    switch(auswahl)
    {
    case 'j':
    exit(0); //sauberes beenden
    break;
    case 'n':
    menue();
    break;
    default:
    printf("\nEingabe nicht korrekt, bitte wiederholen");
    }
    }

    void menue(void)
    {
    clearscreen();
    char menue_inhalt[]=
    {
    "
    ***********************************",
    "* Adressverwaltung in C ",
    "
    ***********************************",
    "* Neue Adresse eingeben (a) ",
    "* Alle Dateien anzeigen (b) ",
    "* Adresse suchen (c) ",
    "* Adresse loechen (d) ",
    "
    ********************************",
    "* Programm beenden (q) ",
    "
    ***********************************"
    };

    for(x=0;x<10;x++)
    {
    printf("\n%60s",menue_inhalt[x]);
    }
    dauswaehlen();
    }

    void dauswaehlen(void) //Datei auswaehlen
    {
    printf("\n\n\tBitte treffen Sie Ihre Auswahl und druecken Sie ENTER: ");
    scanf("%s",&auswahl);

    switch(auswahl)
    {
    case 'a':
    deingabe();
    break;
    case 'b':
    dausgabe();
    break;
    case 'c':
    dsuchen();
    break;
    case 'd':
    dloeschen();
    break;
    case 'q':
    dbeenden();
    break;
    default:
    printf("\nEingabe nicht korrekt, bitte wiederholen");
    }
    }

    /*Hauptfunktion*/

    int main(void)
    {
    clearscreen();
    do
    {
    menue(); //Funktion menue aufrufen
    }
    while(abbruch != 27);
    dbeenden();
    return 0;
    }



  • Original erstellt von quack:
    **

    void deingabe( void ) //Datei eingeben
    {
       clearscreen();
       char name;
       
       printf( "\nName:" );
        scanf( "%d", &name );
    }
    

    **

    1. "char name;" ... damit kannst du maximal ein Zeichen einlesen -> besser: "char name[20];". damit kannst du 20 Zeichen eingeben
    2. "scanf( "%d", &name );" ... die formatanweisung "%d" ist für Zahlenwerte gedacht. mit "%c" kannst du ein einzelnes Zeichen und mit "%s" einen String/char-Array einlesen.
      Hinweis: wenn du mit "%s" einen String einließt, kannst du den Adressoperator weglassen, weil der Name des Arrays für den Compiler gleichbedeutend mit der Anfangsadresse des Arrays im Speicher, d.h. mit der Adresse des ersten Arrayelments 😉

    Ich würde es dann folgendermaßen schreiben:

    void deingabe( void ) //Datei eingeben
    {
       clearscreen();
       char name[20];
    
       printf( "\nName:" );
        scanf( "%s", name );
    }
    

    Das war das was ich jetzt auf den ersten Blick gesehen hab ...

    MfG

    [ Dieser Beitrag wurde am 13.11.2002 um 14:30 Uhr von guard editiert. ]



  • Ach so was ich vergessen hab:
    "printf("\n\nSie gaben%d ein\n", name);" ... die Formatanweisung für printf und scanf sind identisch. Das heißt es müßte "printf("\n\nSie gaben %s ein\n", name);"



  • hallo.
    Das ist alles etwas konfus....
    Du hast wenig Ueberblick, weil Du nicht sofort siehst, wohin Du nach Deinen Funktionen springst.
    Uebersichtlicher ist es(zumindest am Anfang), wenn Du am Ende Deiner Funktionen einfach die Funktion aufrufst, in die Du als naechstes springen willst.Damit machst Du Dir auch den Weg der Daten bewusst.

    TIP: Was passiert nach deingabe(); ????

    Gruss Krishna



  • Hi,

    bitte Code-Tags benutzen.

    printf("\n\t\tAuswahl: ");
    scanf("%s",&auswahl);
    

    Auswahl ist vom Typ char, richtig waere es hier, nicht %s
    in scanf anzugeben, sondern %c fuer character.

    mfg
    v R



  • hallo,

    erst einmal vielen dank für die schnelle hilfe!! 🙂
    ich habe jetzt die richtige formatanweisung angegeben.

    leider springt das programm nach der eingabe des textes in deingabe() sofort wieder ins menue() obwohl eigentlich vorher eine ausgabe des eingegebenen textes erfolgen sollte!

    woran kann das liegen?

    desweiteren habe ich wie angegeben die formatanweisung von "s" auf "c" in dbeenden() umgeändert! komischerweise wird dann dbeenden() nicht mehr angesprungen sondern das programm springt auch hier wieder ins menu...
    wenn ich als formatanweisung "s" eingebe funktioniert es...

    auch jetzt wieder vielen dank im voraus...
    axel

    -------------->>>>>

    #include <stdio.h> //ANSI-C Library
    #include <conio.h> //keine ANSI-C Library, Sun oder Linux nicht verfügbar

    /*Variablen*/
    char auswahl;
    char abbruch;
    int x;

    /*Funktionen Aufruf*/
    void menue(void);
    void clearscreen(void);

    void deingabe(void); //Datei eingeben
    void dausgabe(void); //Datei ausgeben
    void dspeichern(void); // Datei speichern
    void dsuchen(void); //Datei suchen
    void dloeschen(void); //Datei loeschen
    void dauswaehlen(void); //Datei auswaehlen
    void dbeenden(void); //Datei beenden

    /*Funktionen*/

    void clearscreen(void) //Bildschirm loeschen
    {
    clrscr();
    }

    void deingabe(void) //Datei eingeben
    {
    clearscreen();
    char name[20];

    printf("\nName: ");
    scanf("%s",&name); //String, Char Array

    printf("\n\nSie gaben%s ein\n", name);

    /*
    printf("\n\t\t\t*****************************\n");
    printf("\t\t\t***** Teilnehmereingabe \n");
    printf("\t\t\t
    ************************\n");
    printf("\n\n\t\t\tName: ");
    printf("\n\n\t\t\tVorname: ");
    printf("\n\n\t\t\tAbteilung: ");
    printf("\n\n\t\t\tRufnummer: ");
    printf("\n\n\n\n\n\n\n\n\t\t\t! Taste druecken fuer Menue !");
    getch();
    */
    }

    void dausgabe(void) //Datei ausgeben
    {
    clearscreen();
    printf("\n\t\t\t******************************\n");
    printf("\t\t\t***** Telefonverzeichnis \n");
    printf("\t\t\t
    *************************\n");
    printf("\n\n\t\t\tGesuchtes Telefonverzeichnis\n");
    printf("\n\n\n\n\n\n\n\n\t\t\t! Taste druecken fuer Menue !");
    getch();
    }

    void dspeichern(void) //Datei speichern
    {
    clearscreen();
    printf("\n\n\n\n\n\t\t Das Telefonverzeichnis wurde gespeichert\n\n");
    printf("\n\n\n\n\n\n\n\n\t\t\t! Taste druecken fuer Menue !");
    getch();
    }

    void dsuchen(void) //Datei suchen
    {
    clearscreen();
    printf("\n\t\t\t***************************\n");
    printf("\t\t\t***** Teilnehmersuche \n");
    printf("\t\t\t
    **********************\n");
    printf("\n\n\t\t\tTeilnehmer: ");
    getch();
    }

    void dloeschen(void) //Datei loeschen
    {
    clearscreen();
    printf("\n\t\t\t****************************\n");
    printf("\t\t\t**** Teilnehmer loeschen \n");
    printf("\t\t\t
    *************************\n");
    printf("\n\n\t\t\tTeilnehmer: ");
    getch();
    }

    void dbeenden(void) //Programm beendenvoid dbeenden(void) //Programm beenden
    {
    clearscreen();
    printf("\n\t\t***************************************************\n");
    printf("\t\t**** Wollen Sie das Programm wirklich beenden? \n");
    printf("\t\t
    'j' oder 'n' und druecken Sie ENTER \n");
    printf("\t\t
    ***********************************************\n\n");

    printf("\n\t\tAuswahl: ");
    scanf("%s",&auswahl);

    switch(auswahl)
    {
    case 'j':
    exit(0); //sauberes beenden
    break;
    case 'n':
    menue();
    break;
    default:
    printf("\nEingabe nicht korrekt, bitte wiederholen");
    }
    }

    void menue(void)
    {
    clearscreen();
    char menue_inhalt[]=
    {
    "
    ***********************************",
    "* Adressverwaltung in C ",
    "
    ***********************************",
    "* Neue Adresse eingeben (a) ",
    "* Alle Dateien anzeigen (b) ",
    "* Adresse suchen (c) ",
    "* Adresse loechen (d) ",
    "
    ********************************",
    "* Programm beenden (q) ",
    "
    ***********************************"
    };

    for(x=0;x<10;x++)
    {
    printf("\n%60s",menue_inhalt[x]);
    }
    dauswaehlen();
    }

    void dauswaehlen(void) //Datei auswaehlen
    {
    printf("\n\n\tBitte treffen Sie Ihre Auswahl und druecken Sie ENTER: ");
    scanf("%s",&auswahl);

    switch(auswahl)
    {
    case 'a':
    deingabe();
    break;
    case 'b':
    dausgabe();
    break;
    case 'c':
    dsuchen();
    break;
    case 'd':
    dloeschen();
    break;
    case 'q':
    dbeenden();
    break;
    default:
    printf("\nEingabe nicht korrekt, bitte wiederholen");
    }
    }

    /*Hauptfunktion*/

    int main(void)
    {
    clearscreen();
    do
    {
    menue(); //Funktion menue aufrufen
    }
    while(abbruch != 27);
    dbeenden();
    return 0;
    }



  • Hallo,

    in dbeenden() und dauswaehlen() ist die Formatierung für scanf() %c. Mit %s überschreibst Du fremden Speicher.

    Schreibe nach jedem scanf() und nach

    printf("\n\nSie gaben%s ein\n", name);

    ein getch();

    dbeenden() in main() ist nicht erreichbar, weil Du abbruch keinen Wert zuweisen kannst.

    MfG Lem



  • ... und verwende bitte Code-Tags bei deinen Quelltexten

    MfG

    [ Dieser Beitrag wurde am 14.11.2002 um 14:19 Uhr von guard editiert. ]

    [ Dieser Beitrag wurde am 14.11.2002 um 14:20 Uhr von guard editiert. ]


Anmelden zum Antworten