PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++: int an string anhängen


Gast
2006-01-24, 21:39:44
Hi!
Wie kann ich eine Zahl an einen String anhängen oder einfügen?

int counter = 0;

for-schleife {
counter++;
string filename = "file" + counter + ".txt";
...

So einfach funktioniert das leider nicht (weiss der Henker wieso...).

Danke schonmal. ;)

Neomi
2006-01-24, 21:42:54
char szFilename [32];

sprintf (szFileName, "file%04i.txt", counter);

noid
2006-01-24, 21:43:16
http://www.cplusplus.com/ref/iostream/stringstream/stringstream.html

sowas? ,)

Trap
2006-01-24, 21:43:29
#include<sstream>

for-schleife {
counter++;
std::ostringstream oss;
oss << "file" << counter << ".txt";
string filename = oss.str();

Coda
2006-01-24, 21:45:45
Mit Boost (www.boost.org) (immer gut zu haben):

#include <boost/lexical_cast.hpp>
#include <string>

using namespace std;
using namespace boost;

const int zahl = 10;
string foo = "An mir hängt eine Zahl " + lexical_cast<string>(zahl);Ist übrigens nur ein Wrapper um den bereits angesprochene Stream.

Gast
2006-01-25, 20:53:50
Danke für die Antworten!
Aber gibt's in C++ keine "normale" Möglichkeit, eine Zahl an einen string zu hängen oder einzufügen? Nur die Umwege über diesen stream oder boost?!

Expandable
2006-01-25, 21:50:29
Was heißt "normal"? Ein Integer wird nun mal im Zweierkomplement gespeichert (falls signed), ein String als Array von Chars (*). Wie willst Du das verknüpfen? Eben, Du musst jede Stelle des Integers in den entsprechenden Char umwandeln. PHP z.B. macht das automatisch. C++ eben nicht. Über Vor- und Nachteile kann man sich streiten.

(*) Die genauen Details hängen allerdings davon ab, wie die STL implementiert wurde. Aber so kann man sich's vereinfacht vorstellen.

Coda
2006-01-26, 10:44:13
Aber gibt's in C++ keine "normale" Möglichkeit, eine Zahl an einen string zu hängen oder einzufügen?Ne. Das haben sie aus irgendwelchen Gründen weggelassen (und das C++ Komittee hat fast immer gute Gründe die sich zuerst nicht erschließen).

Expandable
2006-01-26, 11:50:31
Andererseits - es müsste ja möglich sein, den +-Operator zu überladen... und dann in der operator+-Funktion den sstream-Code ausführen. Dann hätte man ein PHP-ähnliches Verhalten simuliert und könnte schreiben myString + myInt... sowas, z.B.:


#include <iostream>
#include <sstream>

std::string operator+(const std::string& str, const int i)
{
std::ostringstream stream;
stream << str << i;

return stream.str();
}

std::string operator+(const int i, const std::string& str)
{
std::ostringstream stream;
stream << i << str;

return stream.str();
}

int main()
{
std::string myString = "String mit angehängtem Integer: ";
int myInt = 33;

myString = myInt + std::string(" ") + myString + myInt;

std::cout << myString;

return 0;
}


Ausgabe ist, wie zu erwarten, "33 String mit angehägtem Integer: 33"

ScottManDeath
2006-01-26, 12:08:34
Ne. Das haben sie aus irgendwelchen Gründen weggelassen (und das C++ Komittee hat fast immer gute Gründe die sich zuerst nicht erschließen).

lexical_cast ist Teil des kommenden C++0x Standard, AFAIK auch schon im TR1 oder TR2 enthalten.

Gast
2006-01-26, 13:07:34
Kann man dann den lexical_cast operator überladen?

Coda
2006-01-26, 13:20:09
lexical_cast ist Teil des kommenden C++0x Standard, AFAIK auch schon im TR1 oder TR2 enthalten.Dachte ich mir schon.

Kann man dann den lexical_cast operator überladen?Cast-Operatoren konnte man noch nie überladen und lexical_cast ist auch kein Operator.

Du kannst deinen Objekten einfach entsprechende Stream-Funktionen verpassen dann funktioniert lexical_cast.

Gast
2006-01-26, 17:51:19
Ich bin doch net dumm das hat sich so angehört als ob es ein op werden soll und nicht nur ne template funktion...

Coda
2006-01-26, 18:52:56
Evtl. wird es das ja, aber ich kann mirs beim besten Willen nicht vorstellen. Das würde nur Aufwand ohne Gewinn bedeuten.