Funktion für nur Zahlen und nur Buchstaben



  • @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!!!



  • Doedel schrieb:

    der gibt mir for(;;)cout<<getch()<<' ';
    da ne 8 aus für Backspace, wie bau ich das jetzt in das Programm ein???

    so:

    8
    

    schreibs einfach hin, so wie '\n' oder 'a' auch.



  • Power Off schrieb:

    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.

    und das fatale dran ist ja, daß nach eigenen angaben schon recht lange programmierst.

    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.

    es geht doch nicht drum., continue und break einzusetzen, sondern es nicht einzusetzen.
    du hast dort, wo ein while reicht, stattdessen for, if, break und continue gesetzt. das ist doch pures obfuscating. und die andere funktion ist schlicht unlesbar. deswegen hab ich sie auch nicht verbessert, weil ich keine lust hab, ein rätsel da zu lösen, was die funktion macht.
    aber falls du mal lust hast, nimm wenigstens isdigit, mach das überlesen von whitespaces in ne eigene funktion, mach das lesen eines unsigneds in eine funktion und signed-lesen wird mithilfe von unsigned-lesen implementiert. und schau wenigstens nach dem schreiben nochmal über den code, ob was zu verbessern ist.



  • volkard schrieb:

    Power Off schrieb:

    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.

    und das fatale dran ist ja, daß nach eigenen angaben schon recht lange programmierst.

    das mein ich ja er soll erst mal LERNEN!! ⚠ ⚠



  • volkard schrieb:

    es geht doch nicht drum., continue und break einzusetzen, sondern es nicht einzusetzen.
    du hast dort, wo ein while reicht, stattdessen for, if, break und continue gesetzt. das ist doch pures obfuscating. und die andere funktion ist schlicht unlesbar. deswegen hab ich sie auch nicht verbessert, weil ich keine lust hab, ein rätsel da zu lösen, was die funktion macht.
    aber falls du mal lust hast, nimm wenigstens isdigit, mach das überlesen von whitespaces in ne eigene funktion, mach das lesen eines unsigneds in eine funktion und signed-lesen wird mithilfe von unsigned-lesen implementiert. und schau wenigstens nach dem schreiben nochmal über den code, ob was zu verbessern ist.

    Wenn Du kein C kannst, dann lass es, volkard. C Bücher gibt's zuhauf.



  • Hier ist eine kommentierte Fassung dieses simplen C Codes, den volkard nicht verstanden hat:

    #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();   /* lies erstes Zeichen */
       /* lies bis entweder EOF, LF, -, oder 0..9 auftaucht */
       while ( c != EOF && c != '\n' && c != '-' && ( c < '0' || c > '9' ) ) {
          c = getchar();
       }
       /* wurde ein - gefunden, setze das Vorzeichen auf negativ. */
       if ( c == '-' ) { s = -1; c = getchar(); }
       /* lies Ziffern (falls vorhanden) */
       while ( c >= '0' && c <= '9' ) { 
          /* multipliziere Wert mit 10 und addiere Nominalwert der Ziffer.
           * Anschliessend, lies naechstes Zeichen
           */
          v = v * 10 + ( c - '0' ); c = getchar(); 
          /* setze "ok" auf 1; Wert enthaelt Ziffern */
          k = 1;
       }
       /* lies bis Zeilen- oder Dateiende */
       while ( c != EOF && c != '\n' ) c = getchar();
       /* Ist der Wert in Ordnung, setze Ergebnis mit Vorzeichen */
       if ( k ) *result = v * s;
       /* kehre zurueck */
       return k;
    }
    
    int main( int argc, char** argv ) {
       int w;
       for (;;) {  /* Endlosschleife bis Abbruchbedingung */
          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" );
             /* Benutzereingabe wiederholen */
             continue;
          }
          /* Wert erhalten; Benutzereingabe abbrechen */
          break;
       }
       /* Wert ausgeben */
       printf( "\nWatt = %d\n", w ); /* Sichtkontrolle */
       return 0;
    }
    

    Ich hoffe, volkard, dass bei Dir jetzt die Lichter angehen. Fuer jemanden, der andere belehrt, solltest Du wirklich solchen Code lesen koennen (noch dazu als Verfechter der Null-Kommentar-Ideologie, nach der jemand, der einen Source nicht lesen kann, die entsprechende Programmiersprache nicht kann).


Anmelden zum Antworten