String2 = String + int
-
CString Test="Nummer"; int Zahl=3; CString string2=""; string2.Format("%s + %d",Test,Zahl); //Oder******************************** CString Test="Nummer "; CString string2=""; int Zahl=3; string2.Format("%d", Zahl); CString string3=Test + string2;
-
Was muss ich denn für CString Includen ? <string.h> und <cstring> bringen nichts
-
xRay47 schrieb:
Was muss ich denn für CString Includen ? <string.h> und <cstring> bringen nichts
Wie wärs mit selbst nachsehen ?
-
Bei Konsolenanwendung:
#include <iostream> #include <string> using namespace std; int main() { string wort="Wort"; int zahl=333; char temp[100]; sprintf(temp, "%d" ,zahl);//Für double oder float: %f string Gesamt=wort + " " + temp; cout << Gesamt << endl; return 0; }
Der vorherige Code war für MFC - Anwendungen gedacht.
Hier noch was für die Konsole. (siehe Martin Richter "sprintf")Damit müsstest Du jetzt aber klarkommen.
-
HermannGo schrieb:
Bei Konsolenanwendung:
Das sprintf braucht man in VS 2010, dank C++11, nicht mehr selbst schreiben. Allerdings fehlt derzeit noch eine Überladung von to_string für int. Deshalb braucht man diesen unschönen cast:
using namespace std; int _tmain(int argc, _TCHAR* argv[]) { string w = "Wort"; int n = 100; // Standardkonform wäre // string s = w + to_string(n); string s = w + to_string(static_cast<long long>(n)); cout << s << endl; return 0; }
-
Hallo,
Das Beispiel mit dem string s = w + to_string(static_cast<long long>(n)); von "nn" funktioniert wunderbar, genauso wie ich es mir erhofft hatte.
Vielen Dank
-
Ich dachte man macht das ganze etwa so:
char Final[32]; char* Test = "Bla"; int Number = 1337; sprintf(Test, "%s + %d", Final, Number);
(Ich bin relativ neu in C++, nicht wundern wenns irgendwie falsch ist. :D)
-
Supreme schrieb:
Ich dachte man macht das ganze etwa so:
Das ist C. Geht so auch in C++, aber da hat man gute Gründe, warum man das nicht so macht.
-
Supreme schrieb:
Ich dachte man macht das ganze etwa so:
char Final[32]; char* Test = "Bla"; int Number = 1337; sprintf(Test, "%s + %d", Final, Number);
(Ich bin relativ neu in C++, nicht wundern wenns irgendwie falsch ist. :D)
Leider ist es weder richtig noch C++
Es wäre wohl ANSI-C und müsste richtiger so aussehen:
sprintf(Final, "%s + %d", Bla, Number);
Allerdings würde man den Vorteil, das es beim Zusammenfügen nicht zum Überlauf
kommen kann, leider verpassen.
-
Ups, stimmt, ich habe nur auf das sprintf geschaut.
merano schrieb:
Leider ist es weder richtig noch C++
Es ist nicht richtig, aber C++.
merano schrieb:
Es wäre wohl ANSI-C und müsste richtiger so aussehen:
sprintf(Final, "%s + %d", Bla, Number);
Das ist auch falsch, statt Bla müsste da Test stehen.
Und so frisst es auch Visual Studio man ist sicher vor einem Überlauf und weil sprintf_s ein Template ist, ist es sogar C++ und kein C.
char Final[32]; char* Test = "Bla"; int Number = 1337; sprintf_s(Final, "%s + %d", Test, Number);
-
nn schrieb:
Und so frisst es auch Visual Studio man ist sicher vor einem Überlauf und weil sprintf_s ein Template ist, ist es sogar C++ und kein C.
Der Satz kann einen echt umhauen, da stimmt ja gar nichts
C++:
typedef std::basic_string<TCHAR> tstring; template<class Type> tstring ToString(Type val) { std::basic_ostringstream<TCHAR> o; o << val; return o.str(); } tstring wort=TEXT("Wort"); int zahl=333; tstring s = wort + ToString(zahl);
-
nn ot ok schrieb:
Der Satz kann einen echt umhauen, da stimmt ja gar nichts
Bleib halt liegen, daran stimmt alles. Hast dich sicher verlaufen, die Vertreter der "reinen Leere" (die zwei e sind Absicht) findest du unten im C++ Unterforum.
Natürlich hast du den Thread nicht ganz gelesen, ich habe dem Fragesteller nicht empfohlen sprintf oder char array zu verwenden. Ich habe lediglich auf eine weitere Antwort geantwortet, wo sprintf empfohlen wurde.
Der Code läuft in VS, natürlich ist es C++, dort gibt es tatsächlich char Arrays und Zeiger. Und sprintf_s sieht so aus
template <size_t size> int sprintf_s( char (&buffer)[size], const char *format [, argument] ... ); // C++ only
es schützt vor Pufferüberläufen und (diese Form) gibt es nur für C++.
Und nein, es ist keine Microsoft Spezialität, Gegenbeispiel
http://docwiki.embarcadero.com/RADStudio/de/Sprintf_s,_swprintf_snn ot ok schrieb:
C++:
Auch eine Lösung, aber sicher nicht sehr effizient. Auch die Implementierungen von std::to_string, die VS2010 schon hat, rufen intern sprintf auf.
-
nn schrieb:
Und nein, es ist keine Microsoft Spezialität, Gegenbeispiel
http://docwiki.embarcadero.com/RADStudio/de/Sprintf_s,_swprintf_sEs ist aber auch nicht Standard.
-
HermannGo schrieb:
CString Test="Nummer"; int Zahl=3; CString string2=""; string2.Format("%s + %d",Test,Zahl);
Wenn schon, dann:
string2.Format("%s + %d", Test.GetString(), Zahl);
Erklärung z.B hier:
http://forums.codeguru.com/archive/index.php/t-504452.html
-
CString
ist MFC, MFC ist MS-only, MS-only heisst MSVC, und mit MSVC funktioniert es, daCString
Layout-kompatibel mitchar const*
ist (*), und MSVC die nötige non-Standard Extension bereitstellt, d.h. das Verhalten von Varargs-Aufrufen mit UDTs definiert.* Dass CString Layout-Kompatibel mit
char const*
ist muss laut Standard IIRC auch nicht so sein, aber wie gesagt: MSVC only, und MSVC garantiert dass es passt.
-
http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx
Some C functions take a variable number of arguments. A notable example is printf_s. Because of the way this kind of function is declared, the compiler cannot be sure of the type of the arguments and cannot determine which conversion operation to perform on each argument. Therefore, it is essential that you use an explicit type cast when passing a CString object to a function that takes a variable number of arguments.
CString kindOfFruit = _T("bananas"); int howmany = 25; _tprintf_s(_T("You have %d %s\n"), howmany, (LPCTSTR)kindOfFruit);
oder eben .GetString() verwenden.
.Format() funktioniert analog zu _tprintf_s.
-
Ja, süss.
Dummerweise macht das aber keiner. Und ich verstehe den Hinweis auch nicht.
CString ist ganz absichtlich und mit einigem Aufwand extra so gemacht damit es mit varargs-Funktionen funktioniert.
Warum dann "verbieten" dass man es verwendet?
-
Na wenn du meinst, dann ist das wohl so.
Ich hab andere Erfahrungen gemacht.