Anzeige:
Ergebnis 1 bis 5 von 5

Thema: [ANSI-C] Problem mit getchar / scanf usw

  1. #1
    Registrierter Benutzer
    Registriert seit
    15.10.2003
    Beiträge
    7

    [ANSI-C] Problem mit getchar / scanf usw

    Hi,
    ich hab ein Problem mit einen Schulprojekt was ich momentan Programmiere und zwar wird bei einen getchar oder scanf noch ein CR oder NT (ka wie man es nun genau nennt) also auf jeden fall das phänomen wo bei der Funktion halt ein "return" einfach übergeben wird ohne das ich vorher noch etwas eingeben konnte.
    Ich hab gestern alle mir zur verfügung stehenden Header Dateien durchsucht aber nix vernünftiges gefunden. Da durch diesen Fehler oftmals einfach bestimmte Eingaben (die wichtig sind, naja welche ist das nicht) übersprungen werden stehe ich vor einen elementaren Problem



    Achja ich hänge einfach mal die Grundstruktur des Datenbank programmes mit an vieleicht hilft es ja (achja die Funktion "input()" ist für die meisten eingaben wichtig


    UND achja bitte kritisiert meinen Programmierstil nicht, ich lern den kram erst seit einen Jahr ...

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    #define MAXstring 100
    #define STRUCTGROESSE 10
    #define DATEINAME "datenbank.lcs"
    // Prototypen
    int menu(void);
    void eingabeDatensatz(void);
    void letztenDatensatzloeschen(void);
    void sucheVornamen(int i);
    void leseDatei(void);
    void speicherDatei(void);
    void gebeDBaus(void);
    void setzeZaehler(void);
    void sucheNachnamen(int i);
    char input(void);
    //char *readline(char *line, int maxline, FILE *fp);
    //structe
    struct addstruct
    {

    char vorname[MAXstring];
    char nachname[MAXstring];
    } adressen[STRUCTGROESSE];

    struct tmpstruct
    {
    int zaehler1;
    int id;
    } temp;

    int main(void)
    {
    temp.id=0;
    temp.zaehler1=0;
    strcpy(adressen[temp.zaehler1].vorname,"EOF");

    while(menu());
    return 0;
    }



    int menu(void)
    {
    setzeZaehler();
    //Diese Steuerzeichen dienen zum löschen des Bildschirms, sie funktionieren nicht auf jeden OS!
    /*printf("\e[2J");
    printf("\e[1;1H");
    */
    printf("\nWillkommen in der DB von Lukas Chr. Schulze\n\
    Bitte waehlen Sie:\n\
    (1) Datensatz eingeben\n\
    (2) letzten Datensatz loeschen\n\
    \n\
    (3) Nach einen Vornamen suchen\n\
    (4) Nach einen Nachnamen suchen\n\
    \n\
    (a) Datensaetze ausgeben\n\
    (l) Datenbank aus einer Datei auslesen\n\
    (s) Datenbank in eine Datei schreiben\n\
    (b) Programm beenden\n\
    --------------\n\
    Ihre Eingabe:");

    char auswahl=0;
    //durch die in den Eckigen Klammern gesetzten Token kann man sicher gehen das nur diese von scanf akzeptiert werden!
    auswahl=input();
    switch(auswahl) {
    case '1': eingabeDatensatz(); break;
    case '2': letztenDatensatzloeschen(); break;
    case '3': sucheVornamen(0); break;
    case '4': sucheNachnamen(0); break;
    case 'a': gebeDBaus(); break;
    case 'l': leseDatei(); break;
    case 's': speicherDatei(); break;
    case 'b': return 1;
    default: printf("Unerwartete Eingabe.\n"); menu();
    }


    return 0;
    }
    /*
    /*Funktion: readline
    *
    * Liest eine Zeile 'maxline - 1' Zeichen aus einem File 'fp', und
    * entfernt den abschliessenden '\n' (sofern vorhanden).
    * Der text wird in line gespeichert
    *
    * Input: line Zeiger auf den Speicherplatz, in dem der String gespeichert
    * werden soll. Der Speicherplatz muss fuer mindestens
    * 'maxline' Zeichen reichen.
    * maxline Anzahl der maximal zu lesenden Zeichen. Es werden
    * hoechstens 'maxline - 1' Zeichen gelesen (eventueller
    * Zeilenruecklauf '\n' nicht mitgezaehlt).
    * fp Filepointer auf zu lesendes File.
    * Output: Zeiger auf den String mit der gelesenen Zeile. Das Ergebnis ist
    * 'NULL', wenn man am Ende der Datei 'fp' angekommen ist und keine
    * Zeile lesen konnte.
    */
    char *readline(char *line, int maxline, FILE *fp) {

    int i;


    if (fgets(line, maxline, fp) == NULL) return NULL;

    // Hier wird der \n hinzugef?gt und gleich darauf wieder entfenrt
    i=0;
    while (line[i] != '\0' && line[i] != '\n') {
    i = i + 1;
    }
    line[i]='\0';

    return line;
    }
    */
    char input(void)
    {
    char input[2];
    char antwort;

    antwort = getchar();

    return antwort;
    }















    void sucheVornamen(int i)
    {
    char tempstring[MAXstring];

    printf("Bitte den Vornamen eingeben nach den Sie Suchen wollen\n\
    Eingabe:\n");
    scanf("%s",tempstring);

    while(strcmp(tempstring,adressen[i].vorname))
    {
    i++;
    if(strcmp("EOF",adressen[i].vorname)==0)
    break;
    }
    if(strcmp("EOF",adressen[i].vorname)==0)
    {
    printf("\nKein Eintrag gefunden!\n");
    input();
    }
    else
    {
    char antwort;
    printf("\nIm Eintrag NR %i wurde das Suchwort gefunden\n",i);
    printf("\nVorname=%s",adressen[i].vorname);
    printf("\nNachname=%s",adressen[i].nachname);
    printf("\nSoll ich weitersuchen?j/n\n");
    antwort=(char)input();

    switch(antwort){
    case 'j': sucheVornamen(i+1);break;
    case 'J': sucheVornamen(i+1);break;

    default: menu();
    }

    menu();
    }
    }
    void sucheNachnamen(int i)
    {
    char tempstring[MAXstring];

    printf("Bitte den Nachnamen eingeben nach den Sie Suchen wollen\n\
    Eingabe:\n");
    scanf("%s",tempstring);

    while(strcmp(tempstring,adressen[i].nachname))
    {
    i++;
    if(strcmp("EOF",adressen[i].vorname)==0)
    break;
    }
    if(strcmp("EOF",adressen[i].vorname)==0)
    {
    printf("\nKein Eintrag gefunden!\n");
    input();
    }
    else
    {
    char antwort;
    printf("\nIm Eintrag NR %i wurde das Suchwort gefunden\n",i);
    printf("\nVorname=%s",adressen[i].vorname);
    printf("\nNachname=%s",adressen[i].nachname);
    printf("\nSoll ich weitersuchen?j/n\n");
    antwort=input();
    switch(antwort){
    case 'j': sucheNachnamen(i+1);break;
    case 'J': sucheNachnamen(i+1);break;

    default: menu();
    }
    }


    menu();
    }




    void eingabeDatensatz(void)
    {

    printf("\e[2J");
    printf("\e[1;1H");
    char stringtemp[MAXstring];
    printf("\nBitte den Vornamen eingeben:\n");

    gets(stringtemp);
    strcpy(adressen[temp.zaehler1].vorname,stringtemp);

    printf("\nBitte den Nachnamen eingeben:\n");
    gets(stringtemp);
    strcpy(adressen[temp.zaehler1].nachname,stringtemp);
    strcpy(adressen[temp.zaehler1+1].vorname,"EOF");
    char weiter;
    printf("\nWeiter mit beliebiger Taste!\n");
    scanf("%c",&weiter);
    menu();
    }

    void letztenDatensatzloeschen(void)
    {
    strcpy(adressen[temp.zaehler1-1].vorname,"EOF");
    strcpy(adressen[temp.zaehler1-1].nachname,"");
    menu();
    }

    void leseDatei(void)
    {
    temp.zaehler1=0;
    struct addstruct addDaten;
    FILE *fhd;
    fhd=fopen(DATEINAME,"rb");
    if(!fhd)
    printf("Datei konnte nicht geoeffnet werden!!");
    else
    {
    while(!feof(fhd))
    {
    fread(&adressen[temp.zaehler1], sizeof(struct addstruct), 1, fhd);
    temp.zaehler1++;
    }

    fclose(fhd);
    }
    menu();
    }
    void speicherDatei(void)
    {

    struct addstruct addDaten;
    FILE *fhd;
    fhd=fopen(DATEINAME,"wb");
    if(!fhd)
    printf("Datei konnte nicht geoeffnet werden!!");
    else
    {
    for(temp.zaehler1=0;temp.zaehler1<STRUCTGROESSE;te mp.zaehler1++)
    {
    fwrite(&adressen[temp.zaehler1],sizeof(struct addstruct),1,fhd);
    }
    fclose(fhd);
    }

    menu();
    }

    void gebeDBaus(void)
    {
    for(temp.zaehler1=0;strcmp(adressen[temp.zaehler1].vorname,"EOF");temp.zaehler1++)
    {
    printf("\nVorname=%s",adressen[temp.zaehler1].vorname);
    printf("\nNachname=%s",adressen[temp.zaehler1].nachname);

    }
    printf("\nweiter?\n");
    getchar();
    getchar();
    menu();
    }
    void setzeZaehler(void)
    {
    for(temp.zaehler1=0;strcmp(adressen[temp.zaehler1].vorname,"EOF");temp.zaehler1++)
    {

    }
    return ;
    }

  2. #2
    Registrierter Benutzer
    Registriert seit
    02.04.2003
    Beiträge
    43
    moin

    ich verwende für diesen zweck immer folgendes makro

    #define FLUSH() freopen("/dev/tty", "r", stdin)

    einfach FLUSH(); vor dem eigentlichen lesen aufrufen.


    ps: verwende das nächste mal doch bitte die code tags


    Gruß HL

  3. #3
    Registrierter Benutzer
    Registriert seit
    15.10.2003
    Beiträge
    7
    nice, funzt dann halt nur unter linux aber der lehrer der das bewertet sollte das haben

  4. #4
    Registrierter Benutzer
    Registriert seit
    15.10.2003
    Beiträge
    7
    hey cool dnake, hat geklappt

  5. #5
    Registrierter Benutzer
    Registriert seit
    02.04.2003
    Beiträge
    43
    bitte


    Gruß HL

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •