Eingabe nur Zahlen (Rest wird ignoriert)



  • int pos=-1; // ist das notwendig, oder genügt auch nur // int pos;
    denn pos bekommt ja irgendwann i zugewiesen.... und vorher ist wert egal

    if (!(isdigit(eingabe[i]) // ist ne tolle Sache... kenne den Befehl nicht. Wir hatten im Unterricht bisher nur die Methode dass man per Asci-Satz Zeichen auschließen kann, also das was ich verscuht hatte mit zeichen zwischen 48 und 57

    habe noch am ende noch ein getch() eingeführt, damit man was sieht... 🙂

    DANKE!!!!



  • ambar schrieb:

    Hallo!

    Ich habe seit paar Wochen C-Unterricht. Nachdem wir If, Else, Schleifen, Arrays und Strings behandlet hatten haben wir als Hausaufgabe eine Aufgabe bekommen, an der ich verzweifel.

    Es soll eine maximal 10 zeichen große Zahl eingegeben werden. Wenn mehr eingegeben wird, wird es ignoriert, was ich erfolgreich realisiert habe.
    Wenn ein Komma eingegeben wird, soll es in einen Punkt ungewandelt werden.
    Wenn etwas anderes außer Zahlen eingegeben werden, werden die weiteren Zeichen bei der Ausgabe nicht ausgegeben und nur alle bis zum ersten falschen Zeichen eingegebenen zeichen ausgegeben mit der Meldung welches zeichen (also deren Stelle) falsch war.

    Nicht ausreichend genau beschrieben.
    Mit 'Zahl' könnte float, int, double (jeweils mit neg. Vorzeichen), oder gar __int64 gemeint sein.
    Aus der Geschichte mit dem Punkt und dem Komma könnte man schließen, dass vermutlich eine Gleitkommazahl eingegeben werden soll. Soll dabei die Exponentialschreibweise auch erlaubt sein - womöglich gar in Kombination mit dem 'falschen' Komma , statt . - also z.B. 31416,E-4 ?



  • danke für den Hinweis... aber so kompliziert ist es dann doch nicht...
    99,9 Prozent geben ihre Zahlen nicht in Exponentenschreibweise ein...

    die Lösung war schon richtig gewesen...

    aber du hast natürlich RECHT!!!!!!!!!

    doch so weit dachte unser Lehrer bestimmt auch nicht... 😃



  • ambar schrieb:

    int pos=-1; // ist das notwendig, oder genügt auch nur // int pos;
    denn pos bekommt ja irgendwann i zugewiesen.... und vorher ist wert egal

    if (!(isdigit(eingabe[i]) // ist ne tolle Sache... kenne den Befehl nicht. Wir hatten im Unterricht bisher nur die Methode dass man per Asci-Satz Zeichen auschließen kann, also das was ich verscuht hatte mit zeichen zwischen 48 und 57

    habe noch am ende noch ein getch() eingeführt, damit man was sieht... 🙂

    DANKE!!!!

    Die Initialisierung von pos mit -1 ist notwendig. Sollte keine ungültiges Zeichen gefunden werden, dann ist das sofort ersichtlich da -1 unmöglich eine Position sein kann (Positionen sind immer positiv). Außerdem könnte es sein, dass das Programm abstürzt, falls auf eine nicht initialisierte Variable zugegriffen wird - pos wird ja nur initialisiert, wenn auch ein ungültiges Zeichen gefunden wurde.

    isdigit überprüft, ob es sich um eine Zahl handelt. Macht also grundsätzlich das gleiche wie du, nur dass es einfach sinnvoller ist, dass man benutzt, was schon vorhanden ist. Dafür gibts das ja.



  • wenn einer zwei punkte eingibt, dann wird das auch ne ganz tolle zahl (das ist nur einer von ganz vielen anderen bugs).



  • machman punkt schrieb:

    wenn einer zwei punkte eingibt, dann wird das auch ne ganz tolle zahl (das ist nur einer von ganz vielen anderen bugs).

    Wie in solchen Fällen vorzugehen ist, steht aber nicht in der Aufgabenstellung. Folglich muss dieser Fall nicht behandelt werden. Die Aufgabenstellung ist aber imho eh sinnlos. Aber seis drum. An was für Bugs hast du denn sonst gedacht? Das so unvorsichtig mit den Indizes umgegangen wird?



  • So könnt's auch gehen:

    #include <stdio.h>
    
    void cb(void)
    {
        int c;
        while ((c = getchar()) != '\n' && c != EOF)
            ;
    }
    
    int main(void)
    {
        unsigned long long zahl;
        int count;
    
        do
        {
            printf("zahl: ");
            count = scanf("%llu", &zahl);
            cb();
        }
        while (count != 1 || zahl > 9999999999);
    
        printf("zahl ist %llu\n", zahl);
    }
    

    Solange unsinged long long gross genug ist.
    🙂



  • mngbd schrieb:

    So könnt's auch gehen:

    #include <stdio.h>
    
    void cb(void)
    {
        int c;
        while ((c = getchar()) != '\n' && c != EOF)
            ;
    }
    
    int main(void)
    {
        unsigned long long zahl;
        int count;
    
        do
        {
            printf("zahl: ");
            count = scanf("%llu", &zahl);
            cb();
        }
        while (count != 1 || zahl > 9999999999);
    
        printf("zahl ist %llu\n", zahl);
    }
    

    Solange unsinged long long gross genug ist.
    🙂

    Entspricht aber der nicht der Aufgabenstellung.



  • char zahlstr[100];
    char fehler=0;
    
    if( 1==scanf("%99s",zahlstr) )
    {
      char *p=strchr(zahlstr,',');
      if( p ) *p='.';
      p=zahlstr;
      while( *p && strchr(".0123456789",*p++) ) ;
      if(*p)
        fehler=1,*p=0;
      printf("=%s\n",zahlstr);
      if( fehler && p-zahlstr<11 )
        printf("Fehler bei %d.Stelle\n",p-zahlstr);
    }
    

    Klappt auch ohne Eiertanz mit "long long" bei Eingaben > 2^32.



  • Es freut mich welches Echo das Thema auslöste.
    Und das ihr euch gegenseitig anheizt... aber mal auf dem Punkt zu kommen... wenn jemand seinem Dozenten sagt, dass die Aufgabe unsinnig ist bekommt er bestimmt kein Binechen dafür... 🙂

    Also hier mal eine Eingabe für eine maximal sechstellige Kundennummer, bei der nur Zahlen eingegeben werden können. Wenn ein Komma eingegeben wird wird es in einen Punkt bei der Ausgabe umgewandelt. Und wenn nicht Zahlen eingegeben werden, also jeglicher Buchstabe oder Sondertaste wird bei der Ausgabe alles bis falschem Zeichen eingegeben und gesagt welches falsch war.

    z.B. Eingabe: 1243d
    Ausgabe: das 5 Zeichen war falsch. KDN ist 1243.

    Die erste Lösung lief.

    kann man aber meine folgende FOR Schleife so umbauen dass es durch Ausschließen bestimmter ASCI Zeichen auch geht??? Ohne viele Befehle eben... eben nur meinen Code korriegieren...??? Wäre super...

    int main()
    {

    char kdn[7];
    int i:

    printf("Bitte Kundennummer max 6 Zeichen eingeben: ");
    fgets(s,7stdin);
    fflush(stdin);

    for (i=0; i> 7; i++) //zeichenbasierte Eingabe
    {if (kdn[i]<48 || kdn[i]>57) //per ACSI nur zahlen erlauben
    {printf(" das %d zeichen war falsch",i);
    }
    }
    if (i= ',')
    (i='.')
    printf("KDN ist %s ",kdn);

    getch();
    return 0;
    }


Anmelden zum Antworten