Char auf Zahlen Prüfen und in int umwandeln



  • Hey.

    Also mein Problem ist, ich speichere einen Eingabe in einen Char und wollte ich verstellen, wenn in diesem Char array NUR Zahlen nethalten sind, dann soll dieses Char Array vllt nich unbedingt umgewandelt werden aber die enthaltenen Zahlen sollen in ein int gespeichert werden.
    Wenn in dem Char array zahlen und eben andere Zeichen ethalten sind soll nix passieren

    char *Test = hallo ein Test //soll eben nichts passieren
    char *Test2 = hallo as ist Test Nummer 2 //Auch nichts, da noch andere Zeichen enthalten sind
    char *Test3 = 12487 //Hier sollen dann die Zahlen in ein int gespeichert werden
    

    mfg Darter



  • Kann es sein, dass da ein paar Anführungszeichen fehlen? Schau dir mal die Funktion atoi an. Musst vorher mit isdigit überprüfen, dass der String nur Ziffern enthält.



  • Hey.

    Oh ja sorry. Ich hab da nur schnell nein bsp zusammengeschrieben, fals es vllt unklar war, was ich wollte und thx die 2 Funktionen kuck ich mir mal an.

    EDIT: Hmmm habs probiert und vllt hatte ich vergessen zu erwähnen, dass es sich nicht um ein char sondern um ein const char handelt und dementsprechen erhalte ich beim compilieren die meldung, dass es nicht möglich sein ein const char und ein int umzuwandeln.

    mfg Darter



  • Wie waere es etwas kanonischer mittels std::stringstream? Das ist der weg, den man in C++ normalerweise geht.



  • Hey.

    Tut mir leid ich bin noch relativ neu im c++ gebiet.
    Was genau macht di e Funktion denn, als was ich prboiert hab scheißerte daran, dass der char konstant ist.

    mfg Darter


  • Mod

    Darter schrieb:

    Hey.

    Tut mir leid ich bin noch relativ neu im c++ gebiet.
    Was genau macht di e Funktion denn

    std::stringstream ist wie fast alles in C++ keine Funktion, sondern eine Objektklasse. Sie stellt einen Ein-/Ausgabestrom zur Verfügung, genauso wie die anderen streams die du sicher auch als Anfänger schon kennst (cin, ein eingabestrom der an die Standardeingabe gekoppelt ist und cout, ein Ausgabestrom der an die Standardausgabe geht). Der Unterschied ist hier, dass das was man in den Stringstream ausgibt, hinterher wieder die Eingabe ist, die man herausholen kann.
    Die Idee zur Zahlenumwandlung ist, dass man sein char-Array (oder std::dtring oder was auch immer) in den Stringstrem schreibt und hinterher den Streamleseoperator >> (welchen du gewiss vom istream cin kennst), benutzt um eine Zahl auszulesen. Die Streamoperatoren sind ziemlich gut gemacht und kommen mit praktisch jeder Eventualität (komische Zahlenformate, falsche Eingaben) irgendwie klar, ohne dass du dich um zu viel kümmern musst. Und falls doch etwas schief geht, geht die Fehlerbehandlung analog zu den anderen streams, was du entweder schon kennen dürftest oder falls nicht, bald kennen lernen solltest.

    Nachzulesen ist so etwas auf Referenzen wie www.cplusplus.com oder auch irgendwo in den FAQ dieses Forums.

    , als was ich prboiert hab scheißerte daran, dass der char konstant ist.

    Verstehe ich nicht. Willst du denn am char etwas verändern?



  • Hey.
    Erstmal danke für die Antwort.
    Es ist so, Ich habe eine Source bekommen, inder man durch eine Console eingaben tägigen kann usw.

    So ich habe in dieser Console nun einen Befehl hinzugefüght, indem man den befehlsnamen und und die Parameter eingeben muss z.b. sowas boradcast[leerstelle]und hier der text.
    Dieser Text wird jetzt eben in einem const char in der angegebenen funktion übergeben und wie ich geschrieben habe soll man bei meinem selbst erstellten befehl nur Zahlen übergeben.

    Dementsprechend muss ich in meiner Funktion eben überprüfen, ob dieses const char nun NUR Zahlen enthalt, wenn ja sollen diese Zahlen in ein int geschrieben werden.

    mein Problem hierbei ist immer, dass selbst wenn ich const char Array mit ner For schleife auf Zahlen prüfen will immer ne Fehlermeldung beim compilieren bekomme, dass ich ein constates char nicht verändern könne usw.

    Joa ich hoffe nun ist klar worauf ich hinauswill und hoffe um hilfe.

    mfg Darter


  • Mod

    Darter schrieb:

    mein Problem hierbei ist immer, dass selbst wenn ich const char Array mit ner For schleife auf Zahlen prüfen will immer ne Fehlermeldung beim compilieren bekomme, dass ich ein constates char nicht verändern könne usw.

    Eben dies ist das komische, denn Überprüfen sollte nichts ändern. Zeig mal Code.



  • Hey.

    Das hier war mein Ansatz:

    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 < sizeof(azahlen); j++)
    		{
    			if(string[i] = azahlen[j])
    			{
    				zahl = true;
    				break; //ist das so richtig?
    			}
    		}
    		if(!zahl)
    		{
    			test = false;
    			break; //ist das so richtig?
    		}
    	}
    


  • 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^^


Log in to reply