Zeichenkette nach Zahlen kontrollieren



  • Hallo Leute,

    folgendes Problem: ich habe eine Zeichenkette, die nach Zahlen kontrolliert werden soll. Sprich: Wenn die Zeichenkette nur aus Zahlen besteht, geht's weiter; ansonsten soll der User nochmal die die Zeichenkette eingeben.

    char bufferNum[8];
    int i,j,k;
    
    Marke: printf ("Nummer eingeben: "); 
    fgets (bufferNum, 8, stdin);
    
    bufferNum[strlen(bufferNum)-1] = 0;   /* Letzte Stelle der Kette löschen */
    
    j=0;
    k=strlen(bufferNum);
    for (i=0; i<k; i++)   /* Kontrollschleife */
    {
       if (bufferNum[i] == '1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9'||'0'||' ')
       {
          j++;
       }
    }
    
    if (j < k)
    {
       printf ("Nummer darf nur aus Zahlen bestehen!\n");
       goto Marke;
    }
    

    Gebe ich jetzt zum Beispiel "123456" ein, geht das Programm weiter. Das Thema ist, wenn ich mit dem obigen Code "123abc" eingebe, geht's auch weiter. Datt darf es aber nett! Sieht hier jemand den Fehler? (sitze jetzt schon drei Stunden davor, ich sehe wohl gar nichts mehr :-))

    Dank Euch!



  • Suppengabel schrieb:

    Hallo Leute,

    if (bufferNum[i] == '1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9'||'0'||' ')
       {
          j++;
       }
    }
    

    das hier funktioniert sicher nicht,

    willst/musst du dir die Funktion selber schreiben? sonst kannst da auf welche in der string.h zurueckgreifen



  • Auf die Idee, in den Bibliotheken zu schauen bin ich nicht gekommen! Also warum selber schreiben, wenn es welche gibt!
    Kennst Du eine, sonst schau ich mal nach!



  • kannst die schleife z.b. auch mit isdigit durchgehen...

    z.b. so (ungetestet)

    int besteht_nur_aus_ziffern(char *str){
    for(;*str;++str)if(!isdigit(*str))return 0;
    return 1;
    }
    


  • Tausend Dank!



  • ein stukturiertes C programm sollte ungefähr so aussehen!

    char bufferNum[8];
    	int i,j,k;
    
    	do
    	{
    		printf ("Nummer eingeben: ");
    		fgets (bufferNum, 8, stdin);
    
    		bufferNum[strlen(bufferNum)-1] = 0;   /* Letzte Stelle der Kette löschen */
    
    		j=0;
    		k=strlen(bufferNum);
    
    		for (i=0; i<k; i++)   /* Kontrollschleife */
    			if (bufferNum[i]>='0'&&bufferNum[i]<='9')
    				j++;
    
    		if (j < k)
    			printf ("Nummer darf nur aus Zahlen bestehen!\n");
    
    	}
    	while(j < k);
    

    goto sollte man Heutzutage nicht mehr benutzen!!

    Das

    if (bufferNum[i] == '1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9'||'0'||' ')
    

    kann überhaut nicht funzen !!!

    wenn dann schon

    if (bufferNum[i] == '1'||bufferNum[i] =='2'||...)
    


  • Habe den Teil...

    j=0;
    k=strlen(bufferNum);
    for (i=0; i<k; i++)   /* Kontrollschleife */
    {
       if (bufferNum[i] == '1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9'||'0'||' ')
       {
          j++;
       }
    }
    
    if (j < k)
    {
       printf ("Nummer darf nur aus Zahlen bestehen!\n");
       goto Marke;
    }
    

    ...mit dem hier ersetzt:

    for(; *pbufferNum; pbufferNum++)
    {
       if(!isdigit(*pbufferNum))
       {
          printf ("Nummer darf nur aus Zahlen bestehen!\n");
          goto Marke;
       }
    }
    

    Das funzt jetzt! Danke Euch!

    Aber warum sollte man goto nicht mehr verwenden?



  • if (bufferNum[i] == '1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9'||'0'||' ') 
       { 
          j++; 
       }
    

    lässt sich einfach mit man: isdigit(3) und man: isblank(3) realisieren.

    Außerdem ist a==b||c nicht gleich wie a==b || a==c (was du in Wirklichkeit machen willst) '1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9'||'0'||' ' wird als erstes ausgewertet und da '1' dem 49 ASCII Code entspricht, ist '1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9'||'0'||' ' das gleiche wie 1. Das heißt, du hast das gleiche wie

    if(bufferNum[i]==1) /* Dieser Code ist äquivalent zu deinen anderen Code. */
    {
        j++
    }
    

    Richtig wäre

    if(bufferNum[i]=='1' || bufferNum[i]=='2' || ··· || bufferNum[i]='9' || bufferNum[i]==' ')
    {
      j++;
    }
    

    weil aber das sehr müsehlig ist, benutzt man isidigit und isblank.



  • for(; *pbufferNum; pbufferNum++) 
    { 
       if(!isdigit(*pbufferNum)) 
       { 
          printf ("Nummer darf nur aus Zahlen bestehen!\n"); 
          goto Marke; 
       } 
    }
    

    argh... was seh ich da in meinem code ... mit nem goto verhunzt... (wo ist hier der prügelsmilie...) 😉



  • goto kann genauso sehr hilfreich sein in manchen Situationen, es ist nicht so das man es gar nicht verwenden sollte es ist nur das das Programm bei einer Überladung von gotos unuebersichtlich wird (was aber genauso durch andere Sachen auch passiert)



  • also imho kann man auf goto komplett verzichten... ich benutz das nur wenn ich jemand anderen nerven will oder gerade zu faul bin aber eigentlich brauch mans überhaupt nicht... die einzige ausrede die ich gelten lassen würde wäre ein break über verschachtelte schleifen damit zu basteln aber das kann man genauso gut mit nem flag machen das man in der/den schleifenbedinung(en) zusätzlich mit abfragt...


Anmelden zum Antworten