Funktion für nur Zahlen und nur Buchstaben



  • 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?



  • while( 1 )
    {
    int taste = getch();
    if( taste=='\r' )break;
    if( taste>='0' && taste<='9' || taste=='\b' )
    {
    }
    else
    {continue;} //ignorieren; continue= sprung zum while(1)
    int len = strlen( Buffer );
    Buffer[len]=taste;
    Buffer[len+1]=0;
    putch( taste ); //anzeigen
    }
    soweit funzt das auch, aber nun muss ich noch wissen wie ich das taste=='\b'
    so richtig einbaue, das ich auch backspace benutzen kann... 😕



  • Doedel schrieb:

    soweit funzt das auch, aber nun muss ich noch wissen wie ich das taste=='\b'
    so richtig einbaue, das ich auch backspace benutzen kann... 😕

    mach einfach "for(;;)cout<<getch()<<' '; udn schau dir an, welche zahl (oder welche zahlen!) ein druck auf die gesuchte taste erzeugt.



  • Power Off schrieb:

    compilerbauer seit 1986 schrieb:

    bauste immer so schlechten code?

    Grundsätzlich, warum?

    um deine beiträge in anderen diskussionen in neuem licht zu sehen.

    [cpp]
      for (;;) { 
          int nflds; 
          printf( "Watt eingeben (Ganze Zahl): " ); 
          if ( !readnum(&w) ) { 
             printf( "\nHaeh?! Was soll das darstellen? Gib doch eine Ganzzahl ein!\n" ); 
             continue; 
          } 
          break; 
      }
    [/cpp]
    

    was man sich alles einfallen läßt, um ein goto zu vermeiden.
    mach doch lieber sowas mit goto, wenn du schleifen noch nicht so kannst.

    printf( "Watt eingeben (Ganze Zahl): " ); 
      while ( !readnum(&w) )
             printf( "\nHaeh?! Was soll das darstellen? Gib doch eine Ganzzahl ein!\n" );
    


  • was ist denn mit (&w) gemeint?



  • volkard schrieb:

    was man sich alles einfallen läßt, um ein goto zu vermeiden.
    mach doch lieber sowas mit goto, wenn du schleifen noch nicht so kannst.

    Ja klar, ich mache das bloß, weil ich mich mit Schleifen nicht auskenne.

    Falls Dir "continue" und "break" unbekannt sein sollten, schau mal in
    den C Standard (ISO 9899:1999) unter Kapitel 6.8.6.2 und 6.8.6.3.



  • Doedel schrieb:

    was ist denn mit (&w) gemeint?

    Ermittelt die Adresse von "w". Nötig, weil readnum() einen Zeiger auf Integer erwartet.


Anmelden zum Antworten