Abfrage ob ein String nur aus Zahlen besteht



  • Wir sollen ein Programm schreiben, das Primfaktoren zerlegt, die Eingabe soll über einen String erfolgen, man ließt eine oder zwei Zahlen mit einer Leerzeile getrennt ein, jetzt will ich testen ob der String nur aus Zahlen besteht, und hab mir die Abfrage überlegt:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main () {
    	int x1, x2, i=0;
    	char teststring[100];
    	printf("Geben sie ein oder zwei Zahlen ein, mit einem Leerzeichen getrennt:\n");
    	gets(teststring); //String einlesen
    	while ((teststring[i] >= 0 && teststring[i] <= 9) || teststring[i]=='\0') { // Jedes Zeichen Abfragen ob >0 und <9 ODER Terminierung
    		if (teststring[i]=='\0') { //Wenn aktuelles Zeichen Terminierung soll er Zahl ausgeben
    			x1=atoi(teststring);
    			printf("Teststring nur aus Zahlen: %d", x1);
    			break; //Schleife verlassen
    		} else { // Ansonsten Position um eins aufaddieren
    			i++;
    		}
    	} //Ende der Abfrage ob String nur aus Zahlen
                    while (teststring[i] != ' ') { //Suche nach dem Leerzeichen
                    if (teststring[i]='\0') {
                    break;
                    } else {
    		i++;
                    }
    	} 
    
    	printf("Leerzeile bei %i. Zeichen", i); //Ausgabe Position des Leerzeichens
    	scanf("%i", &x2);
    }
    

    Die untere Abfrage nach der Leerzeile funktioniert einwandfrei..
    Nur wenn ich eine einzelne Zahl eingebe, dann durchläuft er die erste Schleife einfach nicht..
    Ich finde einfach keinen Fehler
    (Sorry, danke für den Formatierungstipp 🙄 )



  • Du solltest deine eigentlich Fragestellung auch und ausführlicher im Text schreiben! Außerdem für Quellcode die entsprechenden Tags nutzen (in deinem Fall "C/C++")!



  • Mach mal aus:

    while ((teststring[i] >= 0 && teststring[i] <= 9) ...

    das:

    while ((teststring[i] >= '0' && teststring[i] <= '9') ...



  • Oder noch besser:

    while ((isdigit(teststring[i])) ...

    isdigit ist in ctype.h deklariert.



  • Es geht mit beiden Möglichkeiten einwandfrei..
    Natürlich gehört das in Hochkommas.. es ist ja als Char deklariert und nicht als Zahl.. danke 😃



  • Zur Erklärung noch du vergleichst deine character auf den ascii code in Dezimal, nicht auf das entsprechende Zeichen.
    Also am besten so machen wie es Belli vorgeschlagen hat, oder korrigieren!

    Dezimal

    while ((teststring[i] >= 48 && teststring[i] <= 57)//...
    

    Hexadezimal

    while ((teststring[i] >= 0x30 && teststring[i] <= 0x39)//...
    

    ...



  • Wie an anderer Stelle hier im Forum schon bemerkt wurde, kann es je nach Hardware/OS sein, daß erstens '0' nicht 48 entspricht, und zweitens die Zeichen '0' - '9' nicht hintereinander im Zeichensatz angeordnet sind.

    Deshalb ist - rein akademisch gesehen - die Variante mit isdigit wahrscheinlich die sauberste.



  • Bei welcher Hardware oder welchem OS soll denn bei ANSI C und einem char dem ich beispielsweise eine '1' zuweise nicht 0x41 sein?



  • oneill5000 schrieb:

    Bei welcher Hardware oder welchem OS soll denn bei ANSI C und einem char dem ich beispielsweise eine '1' zuweise nicht 0x41 sein?

    Zum Beispiel hier auf 'meinem' IBM-Mainframe. Der benutzt den EBCDIC-Zeichensatz. Da sind die Ziffern:
    '0' - '9' --> 0xF0 - 0xF9

    Also zumindest liegen sie da auch hintereinander, aber wie gesagt, auch darauf kann man sich wohl nicht verlassen.



  • Ok. Das scheint wohl laut Wikipedia der einzige Zeichensatz neben ASCII/Unicode zu sein, der noch eine gewisse Verbreitung hat. Allerdings das auch nur auf Großrechnern.
    Wieder was dazu gelernt.




Anmelden zum Antworten