isdigit()



  • Original erstellt von <Henrie>:
    **```cpp
    if(isalpha(ch)) cout<<"Zeichen!";
    if(isdigit(ch)) cout<<"Ziffer/Zahl!";

    Fast.
    isalpha() prüft, ob es ein alphanumerisches Zeichen ist (also Ziffer oder Zahl), isdigit() prüft, ob es eine Ziffer ist.



  • Nein isaplha prüft ob der char alphabetisch ist 😉



  • Nochmal ne Frage dazu: Hab mitlerweile schon was zu isdigit gefundeb,könnte aber bitte mal jemand im isdigt-Bereich dieses Programms(ist noch im Aufbau) schauen,warum isdigit nicht prüft?

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

    char Dateiname[]="Datenbank.txt";
    char Auswahl;
    int i=0,x=1,b=0,max=10;
    int ArtNrMin=1000,ArtNrMax=99999;
    char Platz[10];
    char Wiederholung;

    const int Maxeintrag=15;

    struct Artikeldb
    {
    int ArtNr,Gewicht,Gruppe,Laenge,Tiefe;
    char ArtBeschr[30],Farbe;
    };

    void main()
    {
    Artikeldb Datenbank[Maxeintrag]={0};

    cout <<"Vorhandene Artikeldatenbank oeffnen? [Ja=1/Nein=0]:";
    cin >>Auswahl;
    cout <<"\n";
    //Schleife Öffnen der Datenbank
    if (Auswahl=='1')
    {
    FILE *f_datei;
    cout <<"Vorhandene Artikeldatenbank wird geoeffnet!\n\n";
    f_datei=fopen(Dateiname,"r");
    //Schleife Kein Inhalt in Datei
    if(f_datei==0)
    {
    cout <<"Es trat ein Fehler beim Oeffnen der Artikeldatenbank -";
    cout <<Dateiname <<"- auf!\n\n";
    }
    else //Schleife Volle Datei
    {
    for(i=0;i< Maxeintrag;i++) //Solange lesen bis (Maxeintrag)erreicht
    {
    fread(&Datenbank[i],sizeof(Artikeldb),1,f_datei);
    }
    fclose(f_datei);
    cout <<"Artikeldatenbank erfolgreich geeoffnet.\n\n";
    }
    }
    else //Speicherung von Dateien
    {
    do //Wiederholung der Eintragungen in Datei
    {
    cout <<"Eingabe von Daten in die Artikeldatenbank\n\n";
    for(b=0;b<x;b++) //Eingabebegrenzung x=1 für eine Nummer
    {
    cout <<"Geben Sie die Artikelnummer ein (zwischen 1000 und 99999):";
    cin >>&Platz[i];
    for(i=0;Platz[i]<=10;i++)
    {
    if(isdigit((Platz[i]>'0')&&(Platz[i]<'9')))
    {
    cout <<"Blablabla\n";

    }
    else
    {
    if((Platz[i]<1000)&&(Platz[i]>99999))
    { cout <<"Fehleingabe!Bitte nochmal eintippen\n";
    }

    }
    }

    Datenbank[x].ArtNr;
    cout <<"Wiederholung? [j/n]";
    cin >>Wiederholung;
    }while(Wiederholung=='j');

    }

    }



  • Könnte das (halbe)Programm bitte jemand prüfen (Es darf kein anderes Zeichen außer 0-9 eingegeben werden und nur zwischen1000 und99999. Danke!



  • Mach das ganze bitte nochmal mit Codetags. Allein das einrücken würde nen Tag dauern 🙄



  • ein Sekundchen bitte:kommt gleich



  • #include <iostream.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    char Dateiname[]="Datenbank.txt";
    char Auswahl;
    int i=0,x=1,b=0,max=10;
    int ArtNrMin=1000,ArtNrMax=99999;
    char Platz[10];
    char Wiederholung;
    
    const int Maxeintrag=15;
    
    struct Artikeldb
    {
       int ArtNr,Gewicht,Gruppe,Laenge,Tiefe;
       char ArtBeschr[30],Farbe;
    };
    
    void main()
    {
       Artikeldb Datenbank[Maxeintrag]={0};
    
       cout <<"Vorhandene Artikeldatenbank oeffnen? [Ja=1/Nein=0]:";
       cin >>Auswahl;
       cout <<"\n";
    //Schleife Öffnen der Datenbank
       if (Auswahl=='1')
       {
          FILE *f_datei;
    
          cout <<"Vorhandene Artikeldatenbank wird geoeffnet!\n\n";
          f_datei=fopen(Dateiname,"r");
          //Schleife Kein Inhalt in Datei
          if(f_datei==0)
          {
             cout <<"Es trat ein Fehler beim Oeffnen der Artikeldatenbank -";
             cout <<Dateiname <<"- auf!\n\n";
          }
          else   //Schleife Volle Datei
          {
             for(i=0;i< Maxeintrag;i++)   //Solange lesen bis Ende(Maxeintrag) erreicht
             {
                fread(&Datenbank[i],sizeof(Artikeldb),1,f_datei);
             }
             fclose(f_datei);
             cout <<"Artikeldatenbank erfolgreich geeoffnet.\n\n";
          }
       }
       else   //Speicherung von Dateien
       {
          do      //Wiederholung der Eintragungen in Datei
          {
             cout <<"Eingabe von Daten in die Artikeldatenbank\n\n";
             for(b=0;b<x;b++)   //Eingabebegrenzung x=1 für eine Nummer
             {
                cout <<"Geben Sie die Artikelnummer ein (zwischen 1000 und 99999):";
                cin >>&Platz[i];
                for(i=0;Platz[i]!='\0';i++)
                {
                   if(isdigit(Platz[i]))
                   {
                      cout <<"Fehleingabe!Bitte nochmal eintippen\n";
    
                   }
                   else
                   {
                      if((Platz[i]<ArtNrMin)&&(Platz[i]>ArtNrMax))
                      {
                         cout <<"Fehleingabe!Bitte nochmal eintippen\n";
                      }
                   }
    
                }
             }
    
          Datenbank[x].ArtNr;
          cout <<"Wiederholung? [j/n]";
          cin >>Wiederholung;
          }while(Wiederholung=='j');
    
       }
    
    }
    

    [ Dieser Beitrag wurde am 02.06.2003 um 18:29 Uhr von HumeSikkins editiert. ]



  • Sorry aber noch ein Versuch:

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

    char Dateiname[]="Datenbank.txt";
    char Auswahl;
    int i=0,x=1,b=0,max=10;
    int ArtNrMin=1000,ArtNrMax=99999;
    char Platz[10];
    char Wiederholung;

    const int Maxeintrag=15;

    struct Artikeldb
    {
    int ArtNr,Gewicht,Gruppe,Laenge,Tiefe;
    char ArtBeschr[30],Farbe;
    };

    void main()
    {
    Artikeldb Datenbank[Maxeintrag]={0};

    cout <<"Vorhandene Artikeldatenbank oeffnen? [Ja=1/Nein=0]:";
    cin >>Auswahl;
    cout <<"\n";
    //Schleife Öffnen der Datenbank
    if (Auswahl=='1')
    {
    FILE *f_datei;

    cout <<"Vorhandene Artikeldatenbank wird geoeffnet!\n\n";
    f_datei=fopen(Dateiname,"r");
    //Schleife Kein Inhalt in Datei
    if(f_datei==0)
    {
    cout <<"Es trat ein Fehler beim Oeffnen der Artikeldatenbank -";
    cout <<Dateiname <<"- auf!\n\n";
    }
    else //Schleife Volle Datei
    {
    for(i=0;i< Maxeintrag;i++) //Solange lesen bis Ende(Maxeintrag) erreicht
    {
    fread(&Datenbank[i],sizeof(Artikeldb),1,f_datei);
    }
    fclose(f_datei);
    cout <<"Artikeldatenbank erfolgreich geeoffnet.\n\n";
    }
    }
    else //Speicherung von Dateien
    {
    do //Wiederholung der Eintragungen in Datei
    {
    cout <<"Eingabe von Daten in die Artikeldatenbank\n\n";
    for(b=0;b<x;b++) //Eingabebegrenzung x=1 für eine Nummer
    {
    cout <<"Geben Sie die Artikelnummer ein (zwischen 1000 und 99999):";
    cin >>&Platz[i];
    for(i=0;Platz[i]!='\0';i++)
    {
    if(isdigit(Platz[i]))
    {
    cout <<"Fehleingabe!Bitte nochmal eintippen\n";

    }
    else
    {
    if((Platz[i]<ArtNrMin)&&(Platz[i]>ArtNrMax))
    {
    cout <<"Fehleingabe!Bitte nochmal eintippen\n";
    }
    }

    }
    }

    Datenbank[x].ArtNr;
    cout <<"Wiederholung? [j/n]";
    cin >>Wiederholung;
    }while(Wiederholung=='j');

    }

    }



  • Versuchs mal mit cin.get() anstatt cin>>



  • Ward schon versucht, ohne Erfolg!!



  • cin >>&Platz[i]; //<= mach mal das & weg
    ...
    if(isdigit(Platz[i])) // isdigit gibt true zurück wenn Platz[i] eine Ziffer ist
    {
       cout <<"Fehleingabe!Bitte nochmal eintippen\n";
    }
    


  • ich hab kein thread gefunden, der's mir erklären konnte, also möcht ich hier noch mal fragen: wie kann ich die eingabe des users auf richtigkeit überprüfen.

    in meinem fall sollen zahlen vom typ float eingegeben werden. das ganze geschieht in einer schleife:

    for(int i=0; i<Anzahl; i++) //Anzahl ist die Anzahl der zu speichernden Einträge
      {
        cout << i+1 << ": "; cin >> Ueberpruefung;
        if(!isalpha(Ueberpruefung))
        {
          Preise[i]=Ueberpruefung;
        } else {
          cout << "Falsche Eingabe" << endl;
          i--;
        }    
      }
    

    dass so was falsch ist hab ich wohl gemerkt, aber wodran genau hängts?
    optimal wäre eine lösung, die ein getipptes komma durch den für float
    zulässigen punkt zu ersetzt, falls dies der fehler bei der eingabe ist.



  • C++ macht man das nicht so -.- Wenn floating point zahlen eingelesen werden sollen:

    std::vector<float> data(max_entrys);
    for (std::size_t i = 0; i < data.size(); ++i)
    {
        std::cout << (i + 1) << ": " << std::flush;
        while (!(std::cin >> data.at(i))) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); }
    }
    

    ...



  • tut mir leid, wenn ich mich ab und zu dumm anstell' - bin eben ein neuling. durch "using namespace std" kann man das std:: doch weglassen oder irre ich mich da?



  • Du irrst dich nicht.
    Aber immer schön aufpassen, dass sich ein using namspace ... nicht in eine Headerdatei verirrt.



  • nochmal zu dem code: selbst wenn er funktioniert bringt er mir nichts, wenn ich ihn nicht verstehe. würd mich freun, wenn mir jemand das schritt für schritt erklären könnte.

    nach dem buch, mit dem ich lerne, steht der namespace immer hinter den includes (ist da nicht verkehrt oder?)



  • Bevor du weiterfragst solltest du dir vielleicht mal was bezüglich namspaces durchlesen.
    z.Bsp.
    http://tutorial.schornboeck.net/namespace.htm
    http://www.cpp-tutor.de/cpp/le16/le16_05.htm



  • std::vector<float> data(max_entrys); // einen dynamischen Array(vector) mit der Größe max_entrys anlegen(den Wert musst du halt festlegen).
    for (std::size_t i = 0; i < data.size(); ++i) // für jedes Element, das in den Array soll...
    {
        std::cout << (i + 1) << ": " << std::flush; // Element-ID + 1 ausgeben ...
        while (!(std::cin >> data.at(i))) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } // solange das einlese fehlschlägt( er also aus der Eingabe keinen float machen kann, setzte alle Fehlerbits zurück und werfe den momentanen Inhalt aus dem buffer ...
    }
    

    ... so ist es stark vereinfacht erklärt 😉



  • vielen dank für alles, werde mich selbst jetzt auch intensiver mit namensräumen beschäftigen


Anmelden zum Antworten