Char auf Zahlen Prüfen und in int umwandeln



  • sizeof funktioniert in dem Sinne, wie du das wünschst, nur bei Arrays (also bei azahlen , aber nicht string ). Verwende zur Längenbestimmung std::strlen() oder gleich std::string (auf www.cplusplus.com nachzuschlagen).


  • Mod

    Das gibt einen Compilerfehler, weil string[i] = azahlen[j] kein Vergleich sondern eine Zuweisung ist. string[i] == azahlen[j] ist ein Vergleich. Damit compiliert es dann (bis auf fehlendes Semikolon in Zeile 8). Ob der Algorithmus an sich richtig ist, mag ich jetzt nicht überprüfen, das bekommst du sicher selber hin.

    Man könnte ihn auf jeden Fall stark vereinfachen, da man vom Standard garantiert bekommt, dass die Zeichen '0' bis '9' im Zeichensatz hintereinander liegen. Daher kann man einfach prüfen, ob das Zeichen einen Wert zwischen '0' und '9' hat.

    edit: Und natürlich noch das was Nexus geschrieben hat. Und vielleicht auch noch Compilerwarnungen beachten. Das sollte (nach Beseitigung der genannten Fehler) noch mindestens die Warnungen bringen, dass du in den for Schleifen signed und unsigned Integer vergleichst. Es ist zwar recht unwahrscheinlich, dass die Funktion jemals einen String mit mehr Zeichen bekommt als ein int fassen kann, aber es kostet ja nichts es gleich richtig zu machen.



  • ok danke erstmal.
    So bekomme ich jetzt wenigstens mal keinen fehler vom compilierer mehr.
    Mein zweites Problem ist ja immer noch, dass ich, wenn eben nur zahlen im String ethalten sind, dass diese dann in ein int gepackt werden, hat da noch jemand ne idee?

    bool test = true;
    	bool zahl = false;
    	char azahlen[10] ={1,2,3,4,5,6,7,8,9,0};
    	const char *string = "test123k";	
    
    	for(int i = 0; i < sizeof(string); i++)
    	{
    		zahl = false;
    		for(int j = 0; j < strlen(azahlen); j++)
    		{
    			if(string[i] == azahlen[j])
    			{
    				zahl = true;
    				break; //ist das so richtig?
    			}
    		}
    		if(!zahl)
    		{
    			test = false;
    			break; //ist das so richtig?
    		}
    	}
    

    EDIT: ja das ist mit dem == ist mir auf aufgefallen ^^


  • Mod

    Darter schrieb:

    ok danke erstmal.
    So bekomme ich jetzt wenigstens mal keinen fehler vom compilierer mehr.
    Mein zweites Problem ist ja immer noch, dass ich, wenn eben nur zahlen im String ethalten sind, dass diese dann in ein int gepackt werden, hat da noch jemand ne idee?

    Dazu hast du ja wohl schon genügend Antworten bekommen. Und bei den gegebenen Antworten ist es auch gar nicht nötig, vorher den String zu prüfen, weil dies schon erledigt wird.

    Falls du es dennoch selber machen willst: Mach dir klar wie eine Stellenwertsystem funktioniert und dann rechne. Die rechteste Stelle im String zählt 1, die zweirechteste Stelle zählt 10, und so weiter.

    Und eine Sache die du noch wissen musst zum selbermachen: Gegeben ein Zeichen a mit einem Wert zwischen '0' und '9'. Dann entspricht a-'0' dem Wert dieser Ziffer. Also wenn a gleich '0' ist, dann ist a-'0' gleich 0, ist a gleich '5', so ist a-'0' gleich 5. Und so weiter.



  • Also ich wie ich auch schon geschrieben habe funktioniert bei mir die Funktion
    isdigit() nicht, da ich immer die Fehlermeldung erhalte:

    Konvertierung von const char * in int nicht möglich

    mfg Darter



  • Darter schrieb:

    const char *string = "test123k";	
    
    	for(int i = 0; i < sizeof(string); i++)
    

    Liest du eigentlich auch die Antworten, die dir gegeben werden?

    Übrigens: Eine Dokumentation zur Standardbibliothek gibts auf www.cplusplus.com. Schau dir diese auch mal an, dann weisst du nämlich, wie isdigit() zu verwenden ist.



  • Hey.

    Ja sorry ich hatte das verstauscht und statt bei string hatte ich stringlen bei azeichen angewendet -.- .
    Und ja die reference hab ich mir hier angschaut:
    http://www.cplusplus.com/reference/clibrary/cctype/isdigit/


  • Mod

    Darter schrieb:

    Konvertierung von const char * in int nicht möglich

    Wenn du da einen const char * übergibst, machst du was falsch. Da sollte ein const char übergeben werden. Wenn du den String mit isdigit checken willst, so musst du dies zeichenweise tun.



  • joa klar.

    So habs ichs Probiert aber wie du vorher schonmal geschrieben hast wir in einem String das erste zeichen 1 das zweite 9 sein richtig?

    Ich hab da jetzt mal in google gesucht ob ich mehr dazu herausbekomme wie ich das nun mach ich muss ja das alle zeichen einzeln überprüfen.

    Hab ihr vllt nen link für mehr infos darüber sonst muss ich eben weiter googeln.

    WIe schon geschrieben so funktioniert es ja nicht, liget aber ja wohl daran, dass eben die zeichen nicht im 1 2 und 3 element gespeichert werden sondern eben anders richtig?

    const char *string = "11a";	
    	bool test = true;
    	for(int i = 0; i > strlen(string); i++)
    	{
    		if(!isdigit(string[i]))		
    			test = false;		
    	}
    

    EDIT: ach ja man könnte natürlich nach test = false; ein break einbauen, da eine weitere überprüfung ja sinloss wäre ^^



  • i > strlen(string);
    

    Da stimmt was nicht. 😉

    isdigit(!string[i])
    

    Und hier ist wohl das Ausrufezeichen an falscher Stelle.

    Übrigens würde ich die Länge vorher abspeichern, sonst musst du sie bei jedem Schleifendurchgang neu berechnen.



  • ja da hatte ich nur rumgespielt, da ich mir nichtmehr sicher war, ob i direkt erhöht wird oder erst nach ablauf der schleife^^



  • So ok ich dank euch für eure unendliche Gedult 😉

    Da das Forum zugleich auch eine lösungssammlung ist hier noch die Lösung die Funktionieren müsste, wenn nicht berichtigt mich -.-

    bool isnum = true;
    	char *Teststring = "1234rrt"
    	int strlen = strlen(Teststring)
    
    	for(int i = 0; i < strlen; i++)
    	{
    		if(!isdigit(Teststring[i]))		
    			isnum = false;		
    	}
    
    	if(isnum)			
    		int test = atoi(Teststring);
    


  • Sieht schon gut aus! Vielleicht noch ein paar Details:

    • Strichpunkte nicht vergessen.
    • Stringliterale wie "1234rrt" würde ich in const char* und nicht char* speichern. Verändern darfst du sie ohnehin nicht, so verhinderst du allfällige Fehler.
    • Ich würde nicht strlen als Bezeichner wählen.
    • Wenn du willst, kannst du den Schleifeninhalt in einer Zeile mit logischem And && ausdrücken. Nur falls dir langweilig ist... 🙂

Anmelden zum Antworten