PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Typumwandlung in C++


Vedek Bareil
2002-12-29, 04:42:33
wie kann man eigentlich in C/C++ eine Zahl in einen String umwandeln? In allen Büchern, in die ich bisher geguckt habe (u.a. Kernighan/Ritchie) steht da nichts drüber drin. Da ist immer nur von Umwandlungen zwischen float und int und umgekehrt oder von Umwandlungen von Strings in float oder int die Rede, aber Umwandlung von float oder int in Strings scheint es nicht zu geben :(
Ich hab's schon mit static_cast<char[]> und reinterpret_cast<char[]> probiert, und auch mit char und char* statt char[], aber das klappt alles nicht.

Nagilum
2002-12-29, 05:30:22
Einfach Casten ist nicht, da Zeichenketten nunmal komplett anders aufgebaut sind als Zahlen.

Probiers mal hiermit:

atof() - Convert string to float
atoi() - Convert string to int
atol() - Convert string to long

Sollten alle in der <stdlib.h> zu finden sein.

Nagilum
2002-12-29, 06:04:40
Äh, Streichen, Setzen, Sechs. :D

Dachte du suchst die umgekehrte Lösung. Was du z.B. nehmen könntest ist sprintf().

char txt[255];
sprintf( txt, "%d", 100 );

Danach steht in "txt" die 100.

MeLLe
2002-12-29, 13:38:19
Originally posted by Nagilum
Äh, Streichen, Setzen, Sechs. :D

Dachte du suchst die umgekehrte Lösung. Was du z.B. nehmen könntest ist sprintf().

char txt[255];
sprintf( txt, "%d", 100 );

Danach steht in "txt" die 100.
Man kann aber auch in der C-Referenz z.B. unter itoa() nachschauen ;)

Elemental
2002-12-29, 15:45:17
Originally posted by MeLLe

Man kann aber auch in der C-Referenz z.B. unter itoa() nachschauen ;)

Funktioniert aber nur mit MBCS und nicht mit Unicode, oder?

mfG
Elemental

Vedek Bareil
2002-12-29, 21:06:08
also ich hab's jetzt mal mit sprintf versucht. Ich hab außerdem noch ein paar andere Funktionen gefunden: _ecvt, _fcvt (die vergessen aber beide den Dezimalpunkt) und _gcvt. Die werden hier beschrieben:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_crt__ecvt.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_crt__fcvt.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_crt__gcvt.asp

itoa ist für meine Zwecke ungeeignet, da ich hauptsächlich auch Fließkommazahlen konvertieren möchte.

BTW: von was für einer C-Referenz sprecht ihr? Wo finde ich die?

Matrix316
2002-12-29, 21:19:14
Geht nicht:

string Text;
int Variable = 100;
Text = (string) Variable;

oder

int Variable = 100;
Variable=string();

?

Edit: Geht wahrscheinlich doch nicht. ;)

Vedek Bareil
2002-12-29, 21:37:29
Originally posted by Matrix316
Geht nicht:

string Text;
int Variable = 100;
Text = (string) Variable; das geht schonmal gar nicht, da C/C++ keinen Datentyp string kennt. Es gibt lediglich char[] (lies: array of char). Und
Text = (char[]) Variable
geht auch nicht.

oder

int Variable = 100;
Variable=string(); das könnte schon eher klappen. Nur müßtest du dazu erst eine Funktion string() schreiben. Und um dies zu tun, müßtest du bereits wissen, wie man Zahlen in Strings konvertiert :D

Matrix316
2002-12-29, 21:42:46
Ich hab ja auch Mist geschrieben. :stareup:

es gibt aber:

#include <string>
[...]
std::string Text;
int Variable = 100;
Text = (std::string) Variable;
[...]

was aber auch nicht funktioniert. ;D

Man könnte aber es auch ganz einfach so machen:

std::string Text="12345";

:D

MeLLe
2002-12-29, 23:23:37
Originally posted by Vedek Bareil
itoa ist für meine Zwecke ungeeignet, da ich hauptsächlich auch Fließkommazahlen konvertieren möchte.
Dann versuchs mit ftoa() ;)

Originally posted by Vedek Bareil
BTW: von was für einer C-Referenz sprecht ihr? Wo finde ich die?
Jegliche Referenz der Sprache sollte Dir die Informationen liefern.
Ein Anhaltspunkt wäre http://www.microsoft.com/msdn

Vedek Bareil
2002-12-30, 01:58:20
Originally posted by MeLLe
Dann versuchs mit ftoa() ;) das war eine der ersten Sachen die ich versucht habe. Tat nich.

Elemental
2002-12-31, 16:57:15
In C# gibts ja so eine praktische ToString-Methode :D

Aber sprintf sollte doch immer gehen, oder?


int zahl1(7);
double zahl2(1.2345);

char String1[255];
char String2[255];

sprintf( String1, "%d", zahl1 );
sprintf( String2, "%lf", zahl2 );


Is jetzt nur so schnell ausm Kopf; nicht getestet.
Und für Unicode gibts glaub ich swprintf.

mfG
Elemental

zeckensack
2003-01-02, 15:24:54
Öhm, ich dachte unter C++ ginge auch sowas:std::string wurst;

wurst << "Hallalü" << 2.5f << 100 << ENDL << "*gnarf*" << ENDL;

std::string salami(28.1f);

cout << salami << wurst;

Vedek Bareil
2003-01-03, 20:59:11
Originally posted by zeckensack
Öhm, ich dachte unter C++ ginge auch sowas:std::string wurst;

wurst << "Hallalü" << 2.5f << 100 << ENDL << "*gnarf*" << ENDL;
mein DevC++ Compiler sagt dazu:
"no match for `string & << const char[8]'"


std::string salami(28.1f);
"no matching function for call to `basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >::basic_string (float)'"

ethrandil
2003-01-03, 23:10:51
solange man keine längeren zahlen hat, die nachkommastellen kennt und keine negativen zahlen, dann kann man es so machen:

char* ftoa(double zahl, int nachkommastellen){
bool nachkomma=false;
int vorkommastellen=0;
long temp;
if(nachkommastellen<0)
return 0; //solls ja geben ;)

for(int c=0;c<zahl;c*=10){
vorkommastellen++; //Stellen vor dem Komma bestimmen
if(c==0)
c++;
}

if(nachkommastellen+vorkommastellen>9) //derbe ungenau ... man bräuchte halt nen anderen algorythmus :P
return 0;

char *zahlstring=new char(sizeof(char)*(vorkommastellen+nachkommastellen+1));
temp=(long)(zahl * hoch(10,nachkommastellen)); //alles über 1! weitere Nachkommastellen abgeschnitten.

for(int c=0;c<=nachkommastellen+vorkommastellen;c++){
if(c<vorkommastellen||c>vorkommastellen){
int digit=temp/hoch(10,vorkommastellen+nachkommastellen-c-1+nachkomma);
temp-=digit*hoch(10,vorkommastellen+nachkommastellen-c-1+nachkomma);
zahlstring[c]=digit+48;
}else{
zahlstring[c]='.';
nachkomma=true;
}
}
return zahlstring;
}

dummerweise ist mir grad die Funktion für x hoch y entfallen ;) hab sie halt selber gemacht


int hoch(int zahl, int exponent){
int temp=zahl;
if(exponent==0)
return 1;
for(int c=1;c<exponent;c++){
temp*=zahl;
}
return temp;
}

MeLLe
2003-01-03, 23:35:33
Originally posted by ethrandil
dummerweise ist mir grad die Funktion für x hoch y entfallen ;) hab sie halt selber gemacht
[/CODE]
z = pow(x,y); wäre auch gegangen ;)

ethrandil
2003-01-03, 23:44:56
:P

MeLLe
2003-01-03, 23:52:30
Originally posted by ethrandil
:P
:naughty: Gern geschehn. :P ;)

govou
2003-01-04, 17:57:23
Ich kenns so:

int Zahl1=9;
String Blah;

Blah = String (Zahl1);

oder:

Blah = IntToStrF (Zahl1, Format, Genauigkeit, Kommastellen);


So geht's eigentlich in C++...imho.

Nagilum
2003-01-05, 01:55:00
Ne, geht leider nicht, da C++ keine Klasse "String" kennt. Du benutzt wahrscheinlich nen zusätzliches Framework.

Also entweder schlägt man sich mit char, TCHAR & Co rum, oder nimmt std::string aus der STL, oder baut sich seine eigene String-Klasse.

Matrix316
2003-01-05, 15:32:27
Originally posted by Nagilum
Ne, geht leider nicht, da C++ keine Klasse "String" kennt. Du benutzt wahrscheinlich nen zusätzliches Framework.

Also entweder schlägt man sich mit char, TCHAR & Co rum, oder nimmt std::string aus der STL, oder baut sich seine eigene String-Klasse.

Sicher muss man std::string nehmen, aber das geht nur mit der Klasse string ( #include <string> ), die es natürlich in C++ gibt, zumindest in Visual Studio 6 ;)!

Aber ich glaub mit namespace kann man das std:: weglassen.

Unregistered
2003-01-13, 20:51:26
Originally posted by Matrix316

Aber ich glaub mit namespace kann man das std:: weglassen.

dafür ist es ja da ;)

Xmas
2003-01-17, 20:24:54
Originally posted by zeckensack
Öhm, ich dachte unter C++ ginge auch sowas:std::string wurst;

wurst << "Hallalü" << 2.5f << 100 << ENDL << "*gnarf*" << ENDL;

std::string salami(28.1f);

cout << salami << wurst;

So was ähnliches geht in der Tat:

#include <iostream>
#include <strstream>

using namespace std;

int main ()
{
strstream wurst;

wurst << 42.000001 << " Melonen" << ends;

cout << wurst.str() << endl;
return 0;
}

Vedek Bareil
2003-01-18, 00:08:05
äh... ich hätte vielleicht erwähnen sollen, daß ich die in einen String konvertierte Zahl nicht mit cout/printf ausgeben will (dazu bräuchte ich die ja nicht in einen String konvertieren), sondern mit SetWindowText. Und SetWindowText besteht auf const char* als Stringformat. std::string oder strstream werden nicht akzeptiert.

zeckensack
2003-01-18, 00:46:38
Die string Klasse definiert aber auch string::c_string() zur 'Konvertierung' (naja nicht wirklich), da wirst du geholfen :)

Xmas
2003-01-18, 01:35:53
Originally posted by Vedek Bareil
äh... ich hätte vielleicht erwähnen sollen, daß ich die in einen String konvertierte Zahl nicht mit cout/printf ausgeben will (dazu bräuchte ich die ja nicht in einen String konvertieren), sondern mit SetWindowText. Und SetWindowText besteht auf const char* als Stringformat. std::string oder strstream werden nicht akzeptiert.
Siehe mein Beispiel ;)

char* strstream::str() macht genau das, es gibt die Adresse auf den String zurück.

cout << wurst << endl;
würde gar nicht funktionieren, weil strstream von ostream abgeleitet ist, und ostream::operator<< logischerweise kein ostream akzeptiert.

btw, SetWindowText will nicht unbedingt ein const char*, das const dort bedeutet nur dass die Funktion den String nicht ändern wird.

Vedek Bareil
2003-01-18, 01:48:09
gut, mit strstream::str() klappt's jetzt. Jetzt stellt sich nur noch die Frage, wie ich den Inhalt eines strstream lösche um ihn neu zu beschreiben. Wenn ich's so mache:

strstream strZahl;

for (int i=1; i<N, i++)
{
// ...
strZahl << i;
SetWindowText(hwndLabel /*Handle des Textausgabefensters*/,
strZahl.str());
}

wird bei jedem Durchlauf strZahl nicht mit dem neuen Wert von i überschrieben, vielmehr wird der neue Wert hinten drangehängt. Die Ausgabe ist also nicht erst 1, dann 2, dann 3, dann 4, sondern erst 1, dann 12, dann 123, dann 1234....

Xmas
2003-01-18, 02:49:54
So sollte es klappen:

strstream strZahl;

for (int i=1; i<N, i++)
{
// ...
strZahl << i << ends;
SetWindowText(hwndLabel /*Handle des Textausgabefensters*/,
strZahl.str());
strZahl.freeze(false);
strZahl.seekp(0);
}

Vedek Bareil
2003-01-19, 05:18:03
ok, jetzt hapert's nur noch an der Formatierung :)
Ich will nämlich den Fortschritt einer Berechnung in Prozent ausgeben. Ich hab das jetzt so gemacht:

#include <sstream>

double fProgress;
char szProgress[10];

for (int i=0; i<N; i++)
{
// Berechnungen

fProgress = double(i)/double(N)*100; // Fortschritt in %

// Konvertierung zum String:
stringstream strProgress;
strProgress << fProgress << "%" <<ends;
strProgress >> szProgress;

// Ausgabe:
SetWindowText(hwndLabel, szProgress);
}

Das ist zwar ein klein wenig anders als deine Kontruktion, XMas, hat aber den gleichen nachteiligen Effekt, daß sich die Zahl der ausgegebenen Nachkommastellen ständig ändert und der ausgegebene String dadurch dauernd in seiner Länge hin und her springt.
Gibt es eine Möglichkeit, die Zahl der Nachkommastellen fest einzustellen, wie bei sprintf?

zeckensack
2003-01-19, 14:19:39
http://www.arachnoid.com/cpptutor/student3.html

cout << setiosflag(ios::fixed) << setprecision(2) << fprogress;

Übrigens würde ich in diesem Fall tasächlich sprintf vorziehen :stareup:

Vedek Bareil
2003-01-20, 00:52:06
cool, jetzt klappt's :)

Naja, mit sprintf wollte ich es ja eigentlich auch machen, aber da hab ich schlimme Dinge drüber gehört, irgendwas mit Buffer-Geschichten. Auch wenn ich selbst bei der Verwendung von sprintf nie Schwierigkeiten bekam...

Xmas
2003-01-20, 00:56:22
Originally posted by Vedek Bareil
cool, jetzt klappt's :)

Naja, mit sprintf wollte ich es ja eigentlich auch machen, aber da hab ich schlimme Dinge drüber gehört, irgendwas mit Buffer-Geschichten. Auch wenn ich selbst bei der Verwendung von sprintf nie Schwierigkeiten bekam...
???
Also sprintf lässt sich im Allgemeinen problemlos nutzen und ist in diesem Fall besser als andere Varianten. Natürlich muss der Output-String groß genug definiert sein, aber da du ja eh die maximale Anzahl der Stellen kennst ist das kein Problem.