Problem bei C Programm



  • du kannst den rueckgabewert von scanf dazu verwenden



  • Einen bestimmten Werteberich kannst Du (meines Wissens) so erzwingen:

    int var;
    
    while ( var < MIN || var > MAX )
       scanf("%d", &var);
    

    Wenn man Buchstaben eingibt kackt bei mir das ganze Programm ab.

    Alternative wäre halt ein String, den man auf andere Zeichen als Ziffern untersucht und dann mit atoi in ein Integer konvertiert.
    Ist etwas komplizierter und es gibt sicherlich eine elegantere Lösung dafür...



  • mit scanf kannst du deine eingabe überprüfen, aber auch nur, wenn du entweder nur buchstaben oder nur zahlen eingibts. bei 100x würde die variante verssagen.

    while(scanf("%d", &pos) != 1)
    {
       printf ("\nFehler! Sie muessen eine Zahl eingeben!\n");
       fflush(stdin);
    }
    

    wenn du nen char hast, kannt du wie mein vorgänger schon gesagt hat,deine eingabe wie 100x auch abfangen, (kannst z.b. deine eingaben ueber den ascii code ueberpruefen)

    mir ist nicht bekannt, wie man scanf 100x abfangen kann 😢



  • Hab Dir mal ne Alternative geschrieben.
    Da ich selber noch Anfänger bin ist das sicherlich nicht so elegant - funktioniert aber:

    // Benutzer darf nur Zahlen eingeben zwischen MIN und MAX
    
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    #define MIN 10
    #define MAX 20
    #define JA 1
    #define NEIN 0
    #define MAXZIFFERN 10
    
    int main(void)
    {
    	int cnt;
    	int var = (MAX+1);
    	int is_zahl = 0;
    	int austritt = NEIN;
    	int austritt2 = NEIN;
    	int tmp_int;
    	unsigned int lange = 0;
    	char tmp_string[MAXZIFFERN+1];
    
    while ( austritt2 == NEIN )		// Legt Wertebereich fest
    {
    		while ( austritt == NEIN )					
    		{	
    				printf("\nEingabe ==> ");
    				fgets(tmp_string, (MAXZIFFERN+1), stdin);				// LIEßT STING EIN
    
    				lange = strlen(tmp_string);					
    				for(cnt=0; cnt<(lange-1); cnt++)	// lange-1, weil wir '\0' nicht vergleichen wollen
    				{
    					tmp_int = tmp_string[cnt];
    					is_zahl = isdigit(tmp_int);
    					if ( is_zahl == 0 )		// Wenn keine Ziffer --> Schleife startet neu
    					{
    							austritt = 0;
    							//puts("Fehlermeldung: Falsches Zeichen");
    							break;
    					}
    					else
    						austritt = 1;       // Wenn nur Ziffern --> Beendet Schleife
    				}
    		  var = atoi(tmp_string);		// Umwandlung in ein Integer
    		  if ( var < MIN || var > MAX )
    		  {
    		  	austritt2 = NEIN;
    		  	austritt = NEIN;
    		  }
    		  else
    		  	austritt2 = JA;
    		}
    
    }
    
    printf("\nDie Zahl lautet: %d\n", var);
    return 0;
    }
    


  • Hallo!

    Hier sind mal die Funktionen, die ich für solche Fälle vorrätig habe. Hier nur für int.

    int StringContainsNumber_Int( char *String, int StringLength )
    {
       int i = 0 ;
    
       for( i = 0 ; i < StringLength ; i++ )
       {
          if( !isdigit( String[i]) && String[i] != '-' )
          {
             return 0 ;  /* Wrong char found */
          }
          /* no else. Character is ok. Just continue searching. */
       }
    
       return 1 ;
    }
    
    int GetNumberFromUser_Int( int *pNumberToGet )
    {
       char Input[80] = "" ;
    
       scanf( "%s" , Input );
    
       if( StringContainsNumber_Int( Input, strlen(Input) ) )
       {
          *pNumberToGet = atoi( Input) ;
    
          return 1 ;
       }
       /* no else. Input is not a number.*/
    
       return 0 ;
    }
    
    int GetNumberFromUser_Int_MinMax( int *pNumberToGet, int Min, int Max )
    {
       int Number = 0 ;
    
       if(   GetNumberFromUser_Int( &Number )
          && Min    <= Number
          && Number <= Max )
       {
          *pNumberToGet = Number ;
          return 1 ;
       }
       /* no else. Input is not a number or it is out of range. */
    
       return 0 ;
    }
    
    int main(int argc, char* argv[])
    {
       int Zahl = 0 ;
    
       int Min = -5 ;
       int Max = 10 ;
    
       printf( "Geben Sie eine Zahl zwischen %d und %d ein :  ", Min, Max );
    
       if( GetNumberFromUser_Int_MinMax( &Zahl, Min, Max ) )
       {
          printf( "Danke schön!" );
       }
       else
       {
          // Mach was anderes.
       }
       getch();
       return 0;
    }
    


  • So sollte es gehen

    do{
    fflush(stdin);
    printf( "Startkapital?\n" );
    }while(!scanf ("%f", &skapital));

    do{
    fflush(stdin);
    printf( "Zinssatz?\n" );
    }while(!scanf ("%f", &zinssatz));

    do{
    fflush(stdin);
    printf( "Jahre?\n" );
    }while(!scanf ("%d", &jahre));

    printf( "\n\n\n" );

    /* Ausgabe der eingelesenen Variablen */
    printf( "Startkapital in Euro: %.0f\n", skapital );
    printf( "Zinssatz in %: %.0f\n", zinssatz );
    printf( "Laufzeit in Jahren: %d\n\n", jahre );



  • Emetiel schrieb:

    So sollte es gehen

    Oder auch nicht - fflush(stdin) ist nicht definiert (und bringt nur auf MS-Compilern etwas).



  • [/quote]Oder auch nicht - fflush(stdin) ist nicht definiert (und bringt nur auf MS-Compilern etwas).[/quote]

    Für fflush muss natürlich die entsprechende .h includet werden. 🙂

    Äääähhhh stimmt geht nur MS-Comps. Hatte ich doch glatt vergessen 🙂



  • Emetiel schrieb:

    Für fflush muss natürlich die entsprechende .h includet werden. 🙂

    Das meinte ich nicht - laut ANSI Standard räumt fflush() nur den Ausgabepuffer eines FILE's aus. Aber stdin ist eine reine Eingabedatei und hat deshalb keinen Ausgabepuffer - daß fflush(stdin) stattdessen dessen Eingabepuffer entsorgt, ist wie gesagt eine Erfindung von MS.

    Standardkonform wäre folgendes, um den Rest der Eingabezeile zu vernichten:

    while(fgetc(stdin)!='\n');
    


  • scanf hat doch einen rückgabewert. du kannst ja ganz einfach checken ob die eingabe funktioniert hat:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int var;
        int check=scanf("%d",&var);
        if (check==0)
           printf("\nFehler bei Eingabevorgang. Bitte erneute Eingabe taetigen!\n\n");
        else
            printf("\nAlles in Ordnung\n\n");
        system("pause");
    };
    

    das musst du dann nur noch in eine while schleife verpacken.

    wenn du mittels fgets() einen String in ein char array einliest und den dann umwandelst kannst du ja bei jedem einzelnen zeichen überprüfen obs in dem gültigen wertebereich liegt. ASCII-Zeichen sind intern auch nur Zahlen und haben alle einen bestimmten wert mit dem man das oben genannte überprüfen kann.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        for (int i=30;i<=125;i++)
            printf("** %d: %c **\t",i,i);
        system("pause");
    };
    

Anmelden zum Antworten