Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C++ "string" + Var

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 <
020
10.09.2003, 14:29 Uhr
virtual
Sexiest Bit alive
(Operator)


Eigentlich ist durch C++ im Vergleich zu C einiges einfacher und nicht schwerer geworden. Im speziellen Fall streams muß ich Dir aber recht geben, daß Streams ein - zumindestens für Anfänger - recht gewöhnungsbedürftig sind.

So einfache Aufgaben, wie einen String + int zusammen in einen neuen String zu packen sind ohne zweifel komplizierter geworden, wenn man die reine C++ Leere nimmt. Die Ausgabe ganzer Datenstrukturen auf einen rutsch, bzw. die Konstruktion von Instanzen mit Hilfe von streams dafür umso einfacher.

Bezogen auf Dein Problem täuscht der Eindruck aber vielleicht auch ein wenig, daß C wirklich einfacher sei: nehmen wir mal folgenden Input:

C++:
char* string = "Irgendwas";
int zahl = 100;


Du willst nun in C etwas schreiben, was die beiden Dinge zu einem Text zusammenfügt, also zu "Irgendwas 100" macht.
Der naive Ansatz wäre:

C++:
char buffer[23]; /* Hier kommt das Resultat hin */
sprintf(buffer, "%s %d", string, zahl);


Lustig. funktioniert. buffer hat genau die richtige Größe. Jetzt gehst Du hin änderst den String in der Länge, der Buffer wird also plötzlich zu klein. Du musst also neben dem string auch die Buffergröße ändern. Folglich wirst Du früher oder später auf die Idee kommen, den Buffer immer so groß zu wählen, daß auch alles reinpasst. Der etwas weniger naive Ansatz sieht also schon deutlich komplizierter aus:

C++:
char* buffer = malloc(strlen(string)+13);
if (NULL == buffer) { /* Fehler */ }
sprintf(buffer, "%s %d", string, zahl);
/* buffer verwenden */
...
free(buffer);


Für die nächste zwei Jahre wärst Du damit auf der sicheren Seite, aber die 64 Bit generation der rechner wartet ja schon, also kann das int plötzlich mehr als 11 Stellen (1 Stelle für vorzeichen!) haben. Also kommtz man schnell zum schluß, daß das noch immer nicht das gelbe vom Ei ist und erweitert:

C++:
char* buffer = malloc(strlen(string)+4+log(CHAR_BIT*sizeof(int))/log(10));
if (NULL == buffer) { /* Fehler */ }
sprintf(buffer, "%s %d", string, zahl);
/* buffer verwenden */
...
free(buffer);


Jetzt ists zwar halbwegs für die Zukunft sicher, aber was ist, wenn wir uns plötzlich entscheiden, daß das "int zahl" eigentlich ein "long long zahl" sein soll? - Schwups, dann haben wir plötzlich neben der Deklaration von zahl selbst zwei zusätzliche Stellen, wo wir das einpflegen wollen.

Für deine sehr speziellen Bedürfnisse mögen die og Erwägungen keine roll Spielen: Die Zahl ist vielleicht immer nur postiv und <100, nimmt also immer nur 2 Zeichen ein. Der Text ist auch nur 4 Zeichen lang. Und daher ist das ja alles in Butter bei Dir. Aber es ist eben eine sehr spezielle Lösung.
Ein C++

C++:
std::stringstream s;
s<<a<<b<<c;
s.str();


Wandelt Deinen Kram immer richtig um, ganz unabh. davon, was Du rein tust (einzige Voraussetzung: für die Objekte a, b, und c müssen entsprechende Operatoren da sein. Dies ist für die Standardobjekte stets gegegeben).
Diese Flexibilität läßt meines Wissen Sprachen wie Pascal/Delphi und andere weit hinter sich: Ein immer passendes Konzept, was man sich nur einmlig merken muß und vor allem - das ist aus meiner Perspektive schon fast am wichtigsten - jederzeit auf eigene Datentypen ausweitbar ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 10.09.2003 um 14:30 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
10.09.2003, 15:33 Uhr
~aitee
Gast


Aha, somit hab ich eigentlich total falsch angefangen??

Ich habe als Vorgabe angenommen ein Consolen Program in C++ schreiben zu schreiben. Natürlich auch, da ich schon ein wenig mit C++ experimentieren musste.

Richtig wäre aber eigentlich möglichst viele Sprachen in ihrer Funktionalität zu kennen bzw. die Info einzuholen, falls man dazu nicht in der Lage ist und im Anschluss die Sprache nach den entsprechenden Bedürfnissen des Programms zu wählen, da dieser Weg möglicherweise einfacher und effektiver ist und sich das Programm möglicherweise performanter gestalten lässt.

Ungefähr so richtig?

Wie sieht es aus mit einer Übersicht? (C/C++ Vergleich)
Sie sollte folgendes leisten:
a. Suchen nach einem Befehl
b. Ausgabe welche Sprache

Ist sowas vorhanden? Leistet das die MSDN irgendwie? Gibt es irgendwo im Netz eine Version der MSDN die immer auf dem neusten Stand ist, oder ändert sich diese nicht mehr?

Gibt es für diese ganzen WinApi Funktionen entsprechende C/C++ Funktionen? Oder muss man sich diese selber gestalten?

greetz, aitee

ach ... und thx virtual
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
10.09.2003, 16:13 Uhr
Oliver
S2-Pixelgeneral


Hallo,

die WinAPI ist in C geschrieben, daher kann man, wenn man C bzw. C++ programmiert, sie auch direkt Nutzen.

Einfach <window.h> includen und dann nutzen (z.B. timeGetTime()).
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
10.09.2003, 16:23 Uhr
~aitee
Gast


Aha ... also reines C? Absolut reines C?

Dann will ich sie ja grade nicht benutzen, ich will ja probieren, möglichst 100% in C++ zu liefern ... bisher klappts leider eher schlecht als recht ... wohl auf Grund mangelnder Kenntnisse :/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
10.09.2003, 16:37 Uhr
0xdeadbeef
Gott
(Operator)


Reines C++ ist nur die STL. Wenn du grafik machen willst, brauchst du ne entsprechende Grafikbibliothek. Unter Windows ist die MFC am verbreitetsten, aber sie macht halt auch viele C-artige Klimmzüge.

Wenn du möglichst nah an C++ bleiben willst, schau dir mal gtkmm an ( www.gtkmm.org )
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
10.09.2003, 16:41 Uhr
~aitee
Gast


Hmm ... kann ich ja nicht benutzen. Bin ja an VC++ gebunden ...

Aber ich les mich mal ein ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
10.09.2003, 17:57 Uhr
0xdeadbeef
Gott
(Operator)


Wieso bist du an VC++ gebunden? www.cygwin.com, da gibts nen gcc für Windoze.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: