Dumme Frage
-
Winnie01 schrieb:
das ist aber falsch :p
Das mag zwar u.U. funktionieren - Allerdings wird hier Speicher beschrieben, der deinem Prog nicht gehört
huh? Da wird nichts in irgendeinen Speicher geschrieben. Das ist 100% standardkonformer Code. Das es - möglicherweise - schlechter Code ist, spielt dabei erst mal keine Rolle.
-
Winnie01 schrieb:
das ist aber falsch :p
Das mag zwar u.U. funktionieren - Allerdings wird hier Speicher beschrieben, der deinem Prog nicht gehört
Interessant. Wenn Du uns jetzt noch zeigen magst wo hier Speicher beschrieben wird?
char * ch = "Bla, bla...";ist hier exakt dasselbe wie
char * ch; ch = "Bla, bla...";
-
Zeiger auf ein char (4 Byte):
char * ch;und beim
ch = "irgendaw";wird im Speicher geschrieben, wo keins vorher mit new angeforder war -> also ins Leere...
Habe ich da im Unterricht etwa gepennt?
Dies ist auch möglich und kein Fehler (aber definitiv falsch):
char * c; c = new char[2]; c = "bla, bla...";frohe Weihnachten :xmas1:
-
Winnie01 schrieb:
Zeiger auf ein char (4 Byte):
char * ch;und beim
ch = "irgendaw";wird im Speicher geschrieben, wo keins vorher mit new angeforder war -> also ins Leere.......
Nein !
Der Zeiger ch wird auf den Anfang des Stringliterals "irgendaw" gesetzt.
Kopiert oder geschrieben wird da nichts.Dies hier:
Winnie01 schrieb:
Zeiger auf ein char (4 Byte):
... [cpp]char * c; c = new char[2]; // (*) c = "bla, bla...";hingegen hinterlässt verwaiste 2 Byte, die Du bei (*) allokierst, in der Folgezeile aber ihre Adresse "vergisst".
Gruß,
Simon2.
-
Winnie01 schrieb:
wird im Speicher geschrieben, wo keins vorher mit new angeforder war -> also ins Leere...
Nö, in den Speicher schreiben tun strcpy und Konsorten. Hier wird einfach ein Zeiger auf einen konstanten String im Datenbereich des Programms in die Zeigervariable c gelegt. Ist wie gesagt exakt das gleiche wie
char * c = "bla, bla...";Dies ist auch möglich und kein Fehler (aber definitiv falsch):
char * c; c = new char[2]; c = "bla, bla...";Korrekt, denn hier wird erst ein Zeiger auf neu allokierten Speicher in eine Zeigervariable gelegt, der dann durch einen Zeiger auf einen konstanten String im Datenbereich des Programms ersetzt wird, womit Du Dich der Möglichkeit beraubt hast, den allokierten Speicher jemals wieder freizugeben

-
um nochmal auf die ausgangsfrage zu antworten:
int main() { using std::string; string name; name = "Ahnung."; printf ("Ich hab keine %s ", name[b].data()[/b] ); return 0; }name ist nur die Stringinstanz. Um an die in der Klasse gespeicherten daten zu kommen, gibts die data()-funktion.
-
#include <string> #include <iostream> int main() { std::string name = "Ahnung."; std::cout << "Ich hab keine " << name << std::endl; return 0; }So, und jetzt verwirrt den armen OP nicht mit dem Pointer Quark :p
-
THX 1138 schrieb:
#include <string> #include <iostream> int main() { std::string name = "Ahnung."; std::cout << "Ich hab keine " << name << std::endl; return 0; }So, und jetzt verwirrt den armen OP nicht mit dem Pointer Quark :p
wieder #include <ostream> vergessen

-
Witzig wie so eine "dumme frage" für soviel interesse sorgt

Ich kann nicht mehr 100% folgen, denke mal ich werd mir das vorgeschlagene tutorial mal zu gemüte führen.
klingt spannend und ich hab ja zeit :>
Also danke für die hilfe.
-
in C++ würde ich es so machen:
#include <iostream> #include <string> class Ausgabe { private: std::string _s; public: Ausgabe() : _s(0) {} Ausgabe(std::string Text); ~Ausgabe() {} void sehen() const; }; Ausgabe::Ausgabe(std::string Text) { _s = Text; } void Ausgabe::sehen() const { std::cout << _s.c_str() << std::endl; } int main() { Ausgabe a("Ich habe keine Ahnung!"); a.sehen(); return 0; }bin für alle Verbeserungsvorschläge natürlich offen

Gruß, Winnie
-
Winnie01 schrieb:
bin für alle Verbeserungsvorschläge natürlich offen

alles streichen?
-
Winnie01 schrieb:
in C++ würde ich es so machen:
#include <iostream> #include <string> class Ausgabe { private: std::string _s; public: Ausgabe() : _s(0) {} Ausgabe(std::string Text); ~Ausgabe() {} void sehen() const; }; Ausgabe::Ausgabe(std::string Text) { _s = Text; } void Ausgabe::sehen() const { std::cout << _s.c_str() << std::endl; } int main() { Ausgabe a("Ich habe keine Ahnung!"); a.sehen(); return 0; }bin für alle Verbeserungsvorschläge natürlich offen

Gruß, Winnie

-
nich akzeptiert? Warum?
-
Overkill? Ich meine wenn Du mit Deinem Auto von A nach B willst, verlädst Du es dann auch in einen Grossraum-LKW und fährst dann mit dem?

-
LordJaxom schrieb:
Overkill? Ich meine wenn Du mit Deinem Auto von A nach B willst, verlädst Du es dann auch in einen Grossraum-LKW und fährst dann mit dem?

Wenn es hier um C++ geht, dann aber richtig :p
-
In c++ ist es genau das 3 Zeilen Programm (von den Includes abgesehen) das vorher gepostet wurde.
Wieso ne eigene Klasse schaffen, wenn es die Klasse string schon gibt? Wieso eine Memberfunktion zum couten, wenn es den operator<< fuer strings eh schon gibt.
Wie gesagt ein absoluter Overkill fuer ein an sich einfaches Programm.
-
wie sagt man so schön: es gibt keine dummen Fragen... Ich wollte halt auch mal was dazu beitragen

Andererseits - wozu den Compiler mit dem Dreizeile bemühen, das mir nur sagen will - dass ich doof bin... Scripte tuhen es auch.
Batch, Bash, Sh und Ä.
echo ich bin doof.oder mal was anspruchvolles - VB\1:
MsgBox "ich auch.", vbInformationVielleicht sollte man sich zuerst überlegen - wozu man das braucht, bevor man mit Programmieren anfängt (und das auch noch in C++). Viele Sachen lassen sich oft viel einfacher lösen (sonst würde es ja die dummen äh die schlauen Scriptsprachen nicht geben)...

-
littlejohn schrieb:
um nochmal auf die ausgangsfrage zu antworten:
int main() { using std::string; string name; name = "Ahnung."; printf ("Ich hab keine %s ", name[b].data()[/b] ); return 0; }name ist nur die Stringinstanz. Um an die in der Klasse gespeicherten daten zu kommen, gibts die data()-funktion.
Nimm statt dem 'data()' lieber 'c_str()'. Es ist nicht garantiert, daß data() einen null-terminierten String zurückgibt - und das kann im Zweifelsfall ungesund sein, wenn du ihn im C-Stil weiterverarbeiten willst.