String auf Komma prüfen und Fehlermeldung ausgeben



  • Hallo,

    ich speicher eine Zahleneingabe erst in ein stringarray. Dieses möchte ich dann auf Kommas prüfen. Wenn ein Komma eingegeben wurde, soll eine Fehlermeldung ausgegeben werde. Wenn kein Komma eingegeben wurde, wird der String mit atio in einen Integer umgewandelt und in der entsprechenden Variablen gespeichert.

    Ich habe versucht, das Problem mit einer Schleife zu lösen, aber alle meine Versuche führen nicht zu dem gewünschten Ergebnis.

    Hier das Stück Code:

    char buffer[20];
    int itest = 1;
    printf("Bitte geben Sie die Artikelanzahl ein: ");		
    scanf("%s", &buffer);							
      do{
         for(int count = 0; count < 20; count++)
           {
             if(buffer[count]<0 || buffer[count] > 9)
             {
               printf("Bitte machen Sie einegültige Eingabe ohne Kommas 
                        oder Buchstaben!\n");
               scanf("%s", &buffer);
             }
             else
                itest = 0;
           }
         }while(itest==1);
    head->anzahl = atoi(buffer);
    

    Danke für eure Hilfe!



  • Hab nun doch endlich eine zufriedenstellende Lösung gefunden.

    printf("Bitte geben Sie die Artikelanzahl ein: ");		
    scanf("%s", &buffer);					
       while(itest!=0)
         {
    	for(int count =0; count <20;count++)
    	 { 
    	    if(buffer[count]==',')
    	      {
    		printf("Bitte machen Sie eine gültige Eingabe 
    			ohne Kommas oder Buchstaben!\n");
    		scanf("%s", &buffer);
    
    	      }
    
    	     if(buffer[count]=='\0')
    		itest = 0;
    
    	}
         }
    head->anzahl = atoi(buffer);
    

    Wenn aber noch jemand Verbesserungsvorschläge hat, bin ich sehr interessiert 🙂



  • Zeile 8 ist nicht so wie du es eigentlich willst weil du chars und ints durcheinander würfelst. Probiers so:

    if(buffer[count]<'0' || buffer[count] > '9')
    

    Und dann noch meine übliche Meckerei: Zeile 1: char buffer[20] ist das Paradebeispiel von schlechter Software. Das Allermindeste was du tun musst ist Zeile 4 ändern.

    scanf("%19s", buffer);
    

    Die 19 sorgt dafür dass nur 19 Zeichen + '\0'-Zeichen gelesen werden und es wird zumindest der sofortige Bufferoverflow verhindert. Ist immernoch schlecht weil nur ein Teil der Eingabe gelesen wird. Aber was solls, du bist in guter Gesellschaft, niemand hält es für nötig ordentlich zu programmieren indem man sich zum Beispiel eine char *readInput()-Funktion schreibt.
    Das & in &buffer in deiner Zeile 4 verstehe ich nicht, du willst doch die Eingabe in buffer reinschreiben und nicht an die Adresse des Pointers auf buffer.

    Btw: Ein scanf("%d", int *i); würde dir das atoi sparen.

    Edit: Ich war etwas spät, aber wahrscheinlich reicht ein

    scanf("%d", head->anzahl);
    

    mit anschließender Prüfung ob in head->anzahl was sinnvolles drinsteht.



  • Krümel1411 schrieb:

    Wenn aber noch jemand Verbesserungsvorschläge hat, bin ich sehr interessiert

    numm doch das: http://www.cplusplus.com/reference/clibrary/cstring/strchr/
    🙂



  • äääh nimm
    🙂



  • Hi,

    Krümel1411 schrieb:

    Hab nun doch endlich eine zufriedenstellende Lösung gefunden.

    deine erste Version war vom Ansatz her schon in ordnung, musst bloß noch aus der 0 eine '0' und aus der 9 eine '9' machen, denn du willst chars vergleichen. Deine zweite Version würde Buchstaben und alle Zeichen außer das Komma durchgehen lassen - nicht wirklich das, was du willst, ne.

    Krümel1411 schrieb:

    Wenn aber noch jemand Verbesserungsvorschläge hat, bin ich sehr interessiert 🙂

    char buf[]  = "123.3x"; // Puffer wurde eingelesen :)
    	char* s;
    for ( s = buf; *s; s++ ) // Nur bis zum Ende der Zeichenkete gehen, können je nach Eingabe weniger als 19 Zeichen sein!
    		if( *s < '0' || *s > '9' ) // Prinzip wie deine erste Version, bloß richtig :)
    			printf("Pfui: %s\n", s);
    	// Das gleiche in Grün mit isdigit().
    for ( s = buf; *s; s++ )
    	if (!isdigit(*s))
    		printf("Pfui: %s\n", s);
    

    Gruß,
    B.B.



  • Danke für eure Antworten. Ich werde gleich mal versuchen, dass umzusetzen.

    @nwp2: Ich habe grad erst angefangen C zu programmieren. Das ich die Eingabe in das Array begrenzen kann, wusste ich nicht. Werde das aber beherzigen 🙂



  • Hab es jetzt mal ungesetzt.
    Die Prüfung klappt jetzt auch super. Ich wollte nun eine Schleife machen, die so lange läuft, bis der Benutzer eine richtige Eingabe macht. Leider funktioniert das nicht.

    char buffer[20];
    char *s;
    int itest = 0;
    
    printf("Bitte geben Sie die Artikelanzahl ein: ");		
    flush(stdin);
    scanf("%19s", buffer);						
    
       while (itest != 1)
         {
           for ( s = buffer; *s; s++ )  
             {
               if( *s < '0' || *s > '9' )  
                 {
                    printf("Bitte machen Sie eine korrekte Eingabe\n");  
                    fflush(stdin); 
                    scanf("%19s", buffer);
                    itest=0;
                 } 
                else
                    itest = 1;
             }
          }
    

    Das Programm durchläuft die Schleife nur 2 mal, da itest auf 1 gesetzt wird, obwohl eine falsche Eingabe gemacht wird. Ich habe auch schon andere Sachen ausprbiert, aber dann bleibt das Programm nach einer richtigen Eingabe hängen. Könnt ihr mir sagen, was ich falsch mache und wie ich es am Besten ändern sollte?



  • Du musst den Puffer nach dem scanf Aufruf leer machen, sonst bringt das nichts. Bedenke das fflush(stdin) doof ist, warum siehe FAQ.
    Eine Alternative zu fflush(stdin) ist eine eigene Funktion aufzurufen, die den Eingabepuffer leer macht:

    void cb() // Clear buffer.
    {
    	setvbuf(stdin,NULL,_IONBF,0); 
    	setvbuf(stdin,NULL,_IOFBF,BUFSIZ); 
    }
    

    Du kannst einige Zeilen sparen, wenn du eine do while Schleife nimmst. Die Prüfung der Eingabe ist ein Kandidat zum Auslagern in eine Funktion.



  • Hallo,

    vielen Dank für deine Antwort. Ich hatte bis heute Urlaub und eben mal deine Funtkion ausprobiert, aber auch damit wird die Schleife nach dem 2. Durchlauf verlassen, obwohl auch ein 2. Mal eine falsche Eingabe gemacht wird.

    Ich weiß einfach nicht, warum die Variable itest geändert wird, obwohl die Eingabe falsch ist.


Anmelden zum Antworten