Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

hey,

also ich glaub das ist jetzt eine echt dumme Frage, aber wär es möglich, dass man in c++ keine Strings deklarieren kann?? Ich habe da nämlich nix gefunden...

Welchem Datentyp weist man denn dann eine Zeichenkette zu?

*verwundertis*

Mfg,

Reality

Geschrieben
wenn du es nicht kennst, solltest dir erst paar basics ansehen:
Bei einer so konkreten Frage auf eine Sammelseite für Tutorials zu verweisen, halte ich für etwas unangebracht.

Welchem Datentyp weist man denn dann eine Zeichenkette zu?
Dafür gibt es die Klasse std::string, die im Header <string> definiert ist.
  • 5 Monate später...
Geschrieben

Nein, das ist ganz ganz übel und sollte auch gar nicht vom Compiler akzeptiert werden weil dir c_str() einen const Zeiger zurück liefert.

Der Zeiger ist Konstant damit du nicht einfach so wild in internen String der Klasse rumschreibst und so über den reservierten Speicher hinausschreibst oder sonst irgendwas änderst was deine std::string Instanz zerstören würde.

Geschrieben
hehe, danke *g*

gut zu wissen - denn ich hätts wohl so gemacht :>

Du kannst auch deinen std::string vorher groß genug dimensionieren, dann "funktioniert" auch das sprintf. Aber die alten C-Funktionen sollten sowieso nicht mit STL-Sachen verwendet werden. Seit VS2500 wird man auch ständig vom Compiler dafür angeblafft ;)

Der saubere Weg ist der stringstream!

Geschrieben
Du kannst auch deinen std::string vorher groß genug dimensionieren, dann "funktioniert" auch das sprintf.
Das mag auf die eine oder andere STL-Implementierung zutreffen. Aber der Standard garantiert weder, dass der Speicher eines std::string am Stück vorliegt, noch dass der Speicher nur diesem einen std::string gehört, und sich nicht mehrere Strings den Speicher teilen.
Geschrieben
Das mag auf die eine oder andere STL-Implementierung zutreffen. Aber der Standard garantiert weder, dass der Speicher eines std::string am Stück vorliegt, noch dass der Speicher nur diesem einen std::string gehört, und sich nicht mehrere Strings den Speicher teilen.

Naja, zumindest ist nicht sichergestellt, dass c_str den tatsächlichen Puffer des strings zurückliefert. Dass c_str einen zusammenhängenden Speicherbereich referenziert ist dagegen garantiert (nullterminiertes array).

Wie gesagt ist die zu empfehlende Methode aber der stringstream!

  • 2 Wochen später...
Geschrieben
hi,

wie kann ich denn einen Wert vom Typ ulong oder integer in einen string aus der Klasse std::string verwandeln? Gibt es da eine Möglichkeit?

Mfg,

Reality

Neben Klotzkopfs Vorschlag gibt es da noch die Funktionen _itoa(int, char*, int) und _ftoa(...)

Geschrieben

naja ob ich jetzt den 'Umweg' über den stringstream oder _itoa und den Zuweisungsoperator std::string::operator= gehe dürften sich einzig in der Performance unterscheiden - wenn überhaupt ein nicht vernachlässigbare Unterschied festzustellen ist?

Geschrieben

itoa ist nutzlos weil es als 2. Parameter einen char Pointer erwartet wo es den umgewandelten String speichern soll. Das heißt man müsste das erst im C-String speichern um es dann dem std::string zuzuweisen. Das wiederum bedeutet das man entweder erstmal prüfen muss wieviele Stellen man für den C-String reservieren muss oder einen anlegen muss der in jedem Fall passt, so oder so ist das verschwendung weil es anders einfacher geht :)

Geschrieben

käme auf die Implementierung an. Welcher der beiden Methoden mehr Speicherplatz benötigt möchte ich nicht unbedingt vorhersagen wollen.

Und soviel mehr zu schreiben ist es letzendlich auch nicht.


char buf[20];

std::string s = _itoa(10, buf);

Geschrieben
käme auf die Implementierung an. Welcher der beiden Methoden mehr Speicherplatz benötigt möchte ich nicht unbedingt vorhersagen wollen.

Und soviel mehr zu schreiben ist es letzendlich auch nicht.


char buf[20];

std::string s = _itoa(10, buf);

Das ist unsicherer C-Code!!! Hat das mal jemand auf einem 64 Bit-System ausprobiert? Hat da der standard-int 64 Bit? Das wären dann 20 Stellen, evtl. mit Vorzeichen und zack würd's hier krachen! Kommt natürlich auf den Compiler an, was der aus dem Code bastelt - ob er immer einen 32-Bit int nimmt, oder das, was auf dem System standard ist.

Geschrieben

Also soweit ich weiss war das so gedacht (lt. Kernighan/Ritchie), aber es wurde mit den 64Bit Maschinen nicht gemacht.

Diese haben im Regelfall (soweit ich weiss) auch nur 32bit (werds gleich testen).

Pointer dagegen sind 64bit lang, so wie die long ints auf den 64Bit Maschinen.

Geschrieben

sooo, hier kommt der test:


printf("int: %d\n", sizeof(int)*8);
printf("long int: %d\n", sizeof(long int)*8);
[/PHP]

ergibt folgenden output:

# g++ test.c -o test

# ./test

int: 32

long int: 64

und noch der beleg dafür, dass es eine 64Bit Maschine ist:

# file test

test: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.1, dynamically linked (uses shared libs), not stripped

und

# cat /proc/cpuinfo | grep "model name"

model name : AMD Athlon 64 X2 Dual Core Processor 4400+

model name : AMD Athlon 64 X2 Dual Core Processor 4400+

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...