char* zu int



  • hi, wie bekomm ich denn raus was für ein Zahlenwert in einem String steht?
    im bcb hab ich dazu immer StrToInt verwendet, aber sowas gibts in dem fall ja nicht (oder?)



  • AHH!
    Wir haben eine FAQ!
    😡



  • Also ich weiß nicht ob es in C/C++ in einer Lib irgendeine Funktion dafür gibt, aber man kann sich sowas auch ohne Problemen selber schreiben.

    Ich kann dir mal einen ausschnitt aus einen meiner Klassen anbieten. da hab ich eine string to double funktion erstellt, ia zwar nicht so sauber programmiert, aber es geht!!

    bool Command::CharToDouble(const char * Zahl, double * Output)
    	{
    	// Zahl kommmt xxxx.xxxx ;
    	// also erstes punkt suchen ,dann in zwei stings zerlegen und berechenen
    	// Auch test machen ob nur Zahlen
    	int Laufvariale=0;
    	int Punkstelle=0;
    
    	char Vorkomma[FLOW_MAX_STRING];
    	char Nachkomma[FLOW_MAX_STRING];
    
    	bool Vor,Nach;
    
    	*Output = 0.0;
    
    	//punktsuchen und ob da ist. keiner da -> Stelle = 0 !!
    	while(Zahl[Laufvariale] != 0)
    		if (Zahl[Laufvariale++] == '.') 
    			{
    			Punkstelle = Laufvariale;
    			break; //nur erstes komma zählen
    			}
    
    	//Nur Vorkommastellen
    	if(!Punkstelle) 
    		{
    		strcpy(Vorkomma,Zahl);
    		Nachkomma[0] = '\0';
    		}
    
    	//mit komma
    	else
    		{
    		strncpy(Vorkomma,Zahl,Punkstelle-1);
    		Vorkomma[Punkstelle-1] = '\0';
    		strcpy(Nachkomma,(Zahl+Punkstelle));
    		}
    
    	//Teste auf Zahlen
    	Vor  = OnlyNumbers(Vorkomma);
    	Nach = OnlyNumbers(Nachkomma);
    	if(Vor || Nach) return true;
    
    	//Ab hier muss alles ok sein !!
    
    	//Länge von Vorkommabrechnen
    	int Laenge = strlen(Vorkomma);
    
    	//brechne Vorkomma anteil
    	Laufvariale=0;
    	while(Vorkomma[Laufvariale]!=0) 
    	{
    	*Output = *Output + (Vorkomma[Laufvariale] - '0') * pow(10,Laenge - Laufvariale-1);
    	Laufvariale++;
    	}
    
    	Laufvariale=0;
    	while(Nachkomma[Laufvariale]!=0) 
    	{
    	*Output = *Output + (double)(Nachkomma[Laufvariale] -'0') * pow(10,-(Laufvariale+1));
    	Laufvariale++;
    	}
    	return false;
    	}
    
    bool Command::OnlyNumbers(const char * Zahl)
    	{
    	int x = 0;
    	while(Zahl[x] != 0 )
    		{ 
    		if(!(('0' <= Zahl[x])&&('9' >= Zahl[x])) ) 
    			return true;
    		x++;
    		}
    	return false;
    	}
    

    (funzt auch mit int, oder kann leicht umgeschreiben werden)

    Wenn das sowas ist, was du suchst .....

    Grüße



  • Erstens kann man sowas mit stringstreams viel leichter lösen, zweitens werden Fehler nicht mit einer bool-rückgabe, sondenr mit Exceptions geregelt, drittens Haben wir eine FAQ, in der das alles schön beschrieben ist, viertens würde es ein einfaches boost::lexical_cast auch tun (www.boost.org).



  • @flow: danke für den code, werd ihn dann mal ausprbieren

    das mit diesem boost, will ich nicht verwenden, weil man den code möglochst ohne irgendeinen anderen kram zu brauchen comilieren können sollte.



  • 😞

    Wir haben hier eine FAQ, in der werden verschiedene alternativen Besprochen, die alle wesentlich besser sind.

    und oben im Forum steht doch klar und deutlich

    Bevor ihr ein neues Thema startet, benutzt bitte die Suchfunktion und werft einen Blick in die FAQs.

    Und genau das hast du nicht gemacht. Stattdessen belästigst du uns mit extrem nervigen Fragen, die wir schon millionen mal gehört haben. Genau dafür gibt es ja die FAQ.



  • Cypher schrieb:

    @flow: danke für den code, werd ihn dann mal ausprbieren

    das mit diesem boost, will ich nicht verwenden, weil man den code möglochst ohne irgendeinen anderen kram zu brauchen comilieren können sollte.

    Wie oft denn noch? stringstream oder notfalls auch atoi wenn du boost nicht verwenden willst.



  • btw:

    CharToDouble -> *ARGH* -> char* != char



  • @flow_cplus: das geht aber auch kürzer

    #include <MATH.H>
    double CharToDouble(const char* chr)
    {
    	int pos=0, length=-1, factor=0;
    	double dbl=0.0;	
    	while(chr[++length]);
    	for (int i=length-1; i>=0; --i)
    	{
    		if ((chr[i]=='.') && (!factor))
    			factor=pos;
    		else
    			if ((chr[i]>='0') && (chr[i]<='9'))			
    				dbl += (chr[i]-'0') * pow(10,pos++);	
    			else throw;
    	}
    	dbl /= pow(10,factor);
    	return dbl;
    }
    


  • *gelöscht - war doppelt*



  • Helium schrieb:

    .... zweitens werden Fehler nicht mit einer bool-rückgabe, sondenr mit Exceptions geregelt ...

    ähm, warum? Also exception sind ja schon ganz net, ich hab sie bisher nur mit java verwendet. Ok, aber was spricht dagegen es anders zu machen. Bool mag jetzt nicht das sinnvollste sein, aber es langt hier. in der win32 sdk und in dx werden ja auch die meisten Fehler über rückgebewerte (int) behandelt. Warum sollte man das nicht auch so machen? Ich seh nicht ganz den deutlichen Vorteil von Execptions.

    @Codewalker: geht natürlich kürzer,ich sagte ja, nicht so schön programmiert, hab an der funktion nix optimiert oder so. Ich hab sie eher im hinblick darauf gschrieben, das ich sowas mal im tutorium programmieren lasse. Und da muss dann die Lösung sehr gut nachvollziehbar sein, und ich meine, der Code is, wenn auch nicht sehr praktikabel, aber gut nachzuvollziehen, es wird halt alles schrittweise gemacht. (one little babystep after time .. :-))

    Gruß Flow



  • Flow_cplus schrieb:

    in der win32 sdk und in dx werden ja auch die meisten Fehler über rückgebewerte (int) behandelt. Warum sollte man das nicht auch so machen? Ich seh nicht ganz den deutlichen Vorteil von Execptions.

    Das sind C APIs. Irgendwie logisch, dass sie keine Exceptions werfen.

    Exceptionen haben den Vorteil, dass du die Fehlerbehandlung dort durchführen kannst, wo es sinn macht und nicht wo sie auftreten.

    Und da muss dann die Lösung sehr gut nachvollziehbar sein, und ich meine, der Code is, wenn auch nicht sehr praktikabel, aber gut nachzuvollziehen, es wird halt alles schrittweise gemacht. (one little babystep after time .. :-))

    Schlechtes Argument. Ein

    template<typename To, typename From>
    To lexical_cast(From const& from)
    {
      To to;
      stringstream s;
      s<<from;
      s>>to;
      return to;
    }
    

    Ist nicht nur besser, kürzer, schöner und mehr flexibel - sondern auch leichter zu lesen.

    btw: was spricht gegen boost - als C++ Programmierer sollte man sich an boost gewöhnen - denn es ist DIE Erweiterung zur C++ Standard Library.



  • @flow-cplus:

    Ganz verwirrend finde ich es, den Rückgabewert von Funktionen als "bool" zu definieren, aber dann "false" zurückzugeben, wenn die Funktion erfolgreich ausgeführt wurde.

    Intuitiv erwarte ich, daß eine Fuktion mit Rückgabewert "bool" im Erfolgsfall ein "true" zurückgibt. 0 als Returnvalue für Erfolg würde ich dagegen nur bei einer Funktion erwarten, die ein Statusbyte (oder einen "Status-Int") zurückgibt. Wenn ich nur den Header Deiner Funktion kennen würde, würde ich sie mit 100%iger Sicherheit falsch anwenden.

    Gruß
    CodeWalker



  • Exceptionen haben den Vorteil, dass du die Fehlerbehandlung dort durchführen kannst, wo es sinn macht und nicht wo sie auftreten.

    naja, mit Rückgabewerten kann man die Fehlerbehandlung ja auch an eine andere Stelle verlagern (wenn auch vielleicht schlecht über mehrer Aufruf-Pfade zurück)

    btw. die Umwandlung der Std-Streams (zb von string nach int) erzeugt bei nichtmöglicher Umwandlung auch keine Exceptions. Und ich find das auch durchaus ok, schließlich sind Exceptions für Ausnahmesituationen da und eine nichtmögliche Umwandlung kann ja durchaus (je nachdem für was man sie braucht) auch im normalen Programmfluss auftauchen



  • Hi!

    Sollte dafür nicht auch

    int atoi(const char* p)
    

    gehen aus der cstdlib?

    Mal etwas vom Thema weg, wo hier gerade boost erwähnt wird. Gibts irgendwo eine Übersicht der Funktionen? Ich suche etwas das ein Verzeichnis ausliest ohne Verwendung der MFC.

    Code-Hacker



  • Gibts irgendwo eine Übersicht der Funktionen?

    Wie Faul kann man eigentlich sein?

    http://www.boost.org/libs/libraries.htm


Anmelden zum Antworten