Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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...

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

ist auch das möglich?


std::string meinStr;
int meinInt = 531;

sprintf(meinStr.c_str(), "%d", meinInt);
[/PHP]

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.

hehe, danke *g*

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

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!

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.
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...
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(...)

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?

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 :)

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);

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.

Hat da der standard-int 64 Bit?

nein, hat er normalerweise nicht

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.

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+

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.