Funktion für nur Zahlen und nur Buchstaben



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



  • der gibt mir for(;;)cout<<getch()<<' ';

    da ne 8 aus für Backspace, wie bau ich das jetzt in das Programm ein???



  • @Doedel kauf dir n buch ueber c und schau dir mal die funktionen der stdio an!
    und lerne lerne... programmieren hat auch viel mit lesen zu tun!!!



  • hab ich schon.... hab ich bloß schlauerweise nicht mit!

    aber trotzdem danke erstmal, ich krieg das schon noch hin!!!


Anmelden zum Antworten