Funktion für nur Zahlen und nur Buchstaben



  • Moin,

    also ich sitze hier gerade in der Berufsschule und brauche dringend ne Funnktion womit ich nur noch Zahlen oder nur noch buchstaben benutzen kann auf der tastatur!
    schonmal danke im Voraus!
    Nils



  • Du kannst doch nach der Eingabe Abprüfen ob die Eingabe Zahlen/Buchstaben enthält und die Eingabe ggf. wiederholen.



  • was zahlst denn?



  • Doedel schrieb:

    also ich sitze hier gerade in der Berufsschule und brauche dringend ne Funnktion womit ich nur noch Zahlen oder nur noch buchstaben benutzen kann auf der tastatur!

    das einfachste ist, die tastenkappen der zahlen mit einem schraubenddreher herauszuhebeln und dann die tastenmechanik zu versekundenklebern. dann tasten wieder drauf und die ziffern gehen nicht mehr. aber warum macht man das? ich kann eigentlich nur nachvollziehen, daß man das mizt der CAPS-LOCK-taste macht.
    oder willste nur in deinem programm was abfangen? auch nicht einfach. gar nicht einfach. da kann der user alles eingeben. du könntest allenfalls nachher mit tricks von http://www.volkard.de/vcppkold/zeichen.html abfragen, ob es erlaubte zeichen waren und widrigenfalls dem user tiernamen geben.

    ps: nimm besser zwei schraubendreher und hebele von zwei seiten zugleich, damit die tastenkappe effektiv nur nach oben gezogen wird. einseitiges hebeln macht tastenkappen oder sogar tastaturmechanik gerne kaputt.



  • Wir sollen ein programm schreiben das anhand einer Liste den Leitungsquerschnitt und den benötigten Schutzschalter errechnet.

    Sind wir soweit auch fertig mit! Allerdings muss ich jetzt n Weg finden hierbei z.b.

    printf( "Watt eingeben:" )
    scanf( "%d", &neuesGeraet.Watt )
    printf ("\n")

    nur Zahlen eingben zu können!

    ne Abfrage vorher muss ich dann nur Buchstaben eingeben können!

    gruss,
    Nils



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • scanf liest dort einfach, bis die erste nicht-ziffer kommt. ist das ein problem? und wenn der user im gerätenamen eine zahl eingibt? also ich stelle mir gerade vor, die zeile davor ist der gerätename und der user gibt nicht "kühlschrank" ein, sondern "coolmaster 2000 in der gästeküche".

    abfangen geht wohl am besten, wenn du jede zeile zuerst in einen string einliest und dann den string erst mal durchliest, ob schlimme zeichen drin sind und gegebenenfalls den user bestrafst. und wenn der string ok ist, kannste dann den string auslesen. aber ich frage mich gerade, ob's das wert ist.
    normalerweise geht man so vor: man sagt sich eindringleich: "auf der konsole macht prüfen keinen spaß, bringt nix zum lernfortschritt bei und später undter graphischen benutzerschnittstellen wird man eh gans gans anders prüfen" und läßt das prüfen von eingaben sein. wenn der benutzer mist eingibt, kriegt er mist geliefert.



  • muss dazu sagen das ich n blutiger anfänger bin!

    aber danke, ich versuch mich mal an strings!



  • Doedel schrieb:

    muss dazu sagen das ich n blutiger anfänger bin!

    na dann, willkommen!

    aber danke, ich versuch mich mal an strings!

    http://www.cplusplus.com/ref/cstdio/gets.html
    http://www.cplusplus.com/ref/cstdio/sscanf.html



  • volkard schrieb:

    ...das einfachste ist, die tastenkappen der zahlen mit einem schraubenddreher herauszuhebeln und dann die tastenmechanik zu versekundenklebern. dann tasten wieder drauf und die ziffern gehen nicht mehr...

    😃 dein Vorschlag ist nur leider nicht sehr flexibel. Stell dir mal vor er möchte irgendwann von Zahlen auf Buchstaben umstellen. Dann braucht man ja immer zwei Tastaturen (eine für Zahlen und eine für Buchstaben).



  • volkard schrieb:

    http://www.cplusplus.com/ref/cstdio/gets.html

    Jaja, hier auf gets() verlinken und dann über C-Strings meckern 🤡



  • scanf liefert zurueck wieviele von den uebergeben argumenten richtig gelesen wurden dadurch kannste pruefen ob die eingabe stimmt.



  • das mit dem nur buchstaben und zahlen einlesen geht mit standardfunktionen nicht. die übliche methode ist, erstmal einen beliebigen eingabestring mit gets() einzulesen und dann zu prüfen, ob die eingabe den anforderungen entspricht. wenn nicht, dann fehlermeldung ausgeben und eingabe wiederholen.

    etwa so:

    #include <stdio.h>
    #include <ctype.h> /* enthaelt isalnum() */
    
    int
    eingabe_nur_alnum (char *str)
    {
      while(*str)          /* solange string-ende nicht erreicht */
        if(!isalnum(*str)) /* wenn zeichen weder buchstabe noch ziffer */
          return 0;        /* dann gebe false zurück */
        else
          str++;           /* andernfalls nächstes zeichen prüfen */
    
      return 1;            /* true, wenn alle zeichen alnum waren */
    }
    
    void
    eingabe (char *str)
    {
      for(;;) /* endlosschleife */
      {
        /* zeile ohne new-line ausgeben */
        fputs("Eingabe: ",stdout);
        fflush(stdout);
    
        /* eingabe einlesen */
        gets(str);
    
        /* eingabe auf korrektheit prüfen */
        if(eingabe_nur_alnum()) break;
    
        /* fehlermeldung */
        puts("***Fehler: Die eingabe darf nur aus buchstaben oder ziffern bestehen");
      }
    }
    


  • for (;;) {
       int nflds;
       printf( "Watt eingeben (Ganze Zahl): " );
       nflds = scanf( "%d", &neuesGeraet.Watt );
       if ( nflds != 1 ) {
          /* Benutzer hat keine Ganzzahl eingegeben */
          printf( "\nHaeh?! Was soll das darstellen? Gib doch eine Ganzzahl ein!\n" );
          continue;
       }
       break;
    }
    printf( "\nWatt = %d\n", neuesGeraet.Watt ); /* Sichtkontrolle */
    

    Bei "nur Buchstaben" nimmst Du am besten "%s", das liest "Wörter" ein, die durch Leerzeichen und Zeilenumbrüche getrennt sind.
    "%d" und "%s" überliesen alle führenden Leerzeichen und Zeilenumbrüche.
    Auch da lohnt es sich, den Rückgabewert von scanf() abzufragen.



  • @PowerOff
    das funzt leider nicht. wenn du zB "123Hallo" eingibst, dann wird scanf() "123" einlesen, 1 zurückgeben, und den rest der eingabe unberührt lassen.



  • Konfusius schrieb:

    @PowerOff
    das funzt leider nicht. wenn du zB "123Hallo" eingibst, dann wird scanf() "123" einlesen, 1 zurückgeben, und den rest der eingabe unberührt lassen.

    Hast recht, gegen Tippfehler nicht immun.

    Hier ist eine bessere Loesung:

    #include <stdio.h>
    
    int readnum( int* result ) {
       int v = 0;  /* wert */
       int s = 1;  /* vorzeichen: 1 = +, -1 = - */
       int k = 0;  /* ok; 0 = falsch, 1 = wahr */
       int c = getchar();
       while ( c != EOF && c != '\n' && c != '-' && ( c < '0' || c > '9' ) ) {
          c = getchar();
       }
       if ( c == '-' ) { s = -1; c = getchar(); }
       while ( c >= '0' && c <= '9' ) { 
          v = v * 10 + ( c - '0' ); c = getchar(); 
          k = 1;
       }
       while ( c != EOF && c != '\n' ) c = getchar();
       if ( k ) *result = v * s;
       return k;
    }
    
    int main( int argc, char** argv ) {
       int w;
       for (;;) {
          int nflds;
          printf( "Watt eingeben (Ganze Zahl): " );
          if ( !readnum(&w) ) {
             /* Benutzer hat keine Ganzzahl eingegeben */
             printf( "\nHaeh?! Was soll das darstellen? Gib doch eine Ganzzahl ein!\n" );
             continue;
          }
          break;
       }
       printf( "\nWatt = %d\n", w ); /* Sichtkontrolle */
       return 0;
    }
    


  • Power Off schrieb:

    int readnum( int* result ) {
       int v = 0;  /* wert */
       int s = 1;  /* vorzeichen: 1 = +, -1 = - */
       int k = 0;  /* ok; 0 = falsch, 1 = wahr */
       int c = getchar();
       while ( c != EOF && c != '\n' && c != '-' && ( c < '0' || c > '9' ) ) {
          c = getchar();
       }
       if ( c == '-' ) { s = -1; c = getchar(); }
       while ( c >= '0' && c <= '9' ) { 
          v = v * 10 + ( c - '0' ); c = getchar(); 
          k = 1;
       }
       while ( c != EOF && c != '\n' ) c = getchar();
       if ( k ) *result = v * s;
       return k;
    }
    

    du darfst inzwischen sogar in C kleine funktionen bauen. SCNR



  • volkard schrieb:

    du darfst inzwischen sogar in C kleine funktionen bauen. SCNR

    Gell, sowas hat seine Vorteile! 😉 😃



  • Power Off schrieb:

    Konfusius schrieb:

    @PowerOff
    das funzt leider nicht. wenn du zB "123Hallo" eingibst, dann wird scanf() "123" einlesen, 1 zurückgeben, und den rest der eingabe unberührt lassen.

    Hast recht, gegen Tippfehler nicht immun.

    Hier ist eine bessere Loesung:

    #include <stdio.h>
    
    int readnum( int* result ) {
       int v = 0;  /* wert */
       int s = 1;  /* vorzeichen: 1 = +, -1 = - */
       int k = 0;  /* ok; 0 = falsch, 1 = wahr */
       int c = getchar();
       while ( c != EOF && c != '\n' && c != '-' && ( c < '0' || c > '9' ) ) {
          c = getchar();
       }
       if ( c == '-' ) { s = -1; c = getchar(); }
       while ( c >= '0' && c <= '9' ) { 
          v = v * 10 + ( c - '0' ); c = getchar(); 
          k = 1;
       }
       while ( c != EOF && c != '\n' ) c = getchar();
       if ( k ) *result = v * s;
       return k;
    }
    
    int main( int argc, char** argv ) {
       int w;
       for (;;) {
          int nflds;
          printf( "Watt eingeben (Ganze Zahl): " );
          if ( !readnum(&w) ) {
             /* Benutzer hat keine Ganzzahl eingegeben */
             printf( "\nHaeh?! Was soll das darstellen? Gib doch eine Ganzzahl ein!\n" );
             continue;
          }
          break;
       }
       printf( "\nWatt = %d\n", w ); /* Sichtkontrolle */
       return 0;
    }
    

    bauste immer so schlechten code?



  • compilerbauer seit 1986 schrieb:

    bauste immer so schlechten code?

    Grundsätzlich, warum?


Anmelden zum Antworten