Unterschied zwischen String-Variable und String-Konstante
-
Hallo liebes Forum.
Ich bin c++ Neuling
Bin gerade beim Thema "Zahlen und Strings" vergleichen.
Jetzt stellt sich mir hier ein Verständnis Problemchen. Ich lerne aus einem Buch für Einsteiger und beim Thema "Zahlen und Strings vergleichen" steht nun:
"Achtung! Die hier vorgestellten Methoden zum Vergleichen von Strings können nur angewendet werden, wenn einer der beteiligten Strings eine string-Variable keine String-Konstant in Anführungszeichen oder ein C-String ist. "
Meine Fragen an euch wären:
1. Was ist eine "string-Variable"?
2. Was ist eine "string-Konstant"?
3. Was ist ein " C-String"?Das verwirrt mich alle noch ein wenig.
Vielleicht kann mir ja hier ein netter User helfen. Ich wäre sehr dankbar.
LG
Lisa
-
String konstante:
"Peace, was geht"
const std::string str("Hohoho")String:
std::string str("Hohoho")c-style string
char str[] = "Hohoho"zumindest kenne ich das so. C-Strings haben die eigenschaft mit \0 terminiert zu werden. Manchmal braucht man einen c-style string, z.B. für fstreams. Dann kannst du aus einem std::string einen c-string machen mit
str.c_str()LG
-
Ich glaub in dem Zusammenhang mit Vergleich schließe ich daraus, dass das Tutorium von folgendem ausgeht:
string-Variable: std::string var
string-Konstante: "Hallo"
C-String: char str[5];
Allgemeingültige Definitionen gibt es aber nur für C-String.
-
das stimmt nicht ganz, cstrings haben den typ "char const*", nicht "char*".
-
asfdlol schrieb:
das stimmt nicht ganz, cstrings haben den typ "char const*", nicht "char*".
Kann man in C keine Strings verändern? (Achtung, Fangfrage)
-
manni66 schrieb:
asfdlol schrieb:
das stimmt nicht ganz, cstrings haben den typ "char const*", nicht "char*".
Kann man in C keine Strings verändern? (Achtung, Fangfrage)
doch, aber cstrings sind nicht strings aus c. cstrings sind string-literale. strings in c sind char-arrays.
edit: strings in c++ sind vom typen std::string. dennoch gibt es keine c++strings, also finde ich den rückschluss darauf, dass cstrings = strings in c sind, falsch.
-
@asfdlol: Ev. fehlt dir in deinem Vokabular noch String-Literal...
-
danke für die Antworten... jetzt bin ich aber noch verwirrter
Vielleicht mal so herum:
Was ist der Unterschied zwischen einer String-Variablen und eine String-Konstanten?
-
Lisa88 schrieb:
danke für die Antworten... jetzt bin ich aber noch verwirrter
Vielleicht mal so herum:
Was ist der Unterschied zwischen einer String-Variablen und eine String-Konstanten?
Unter einer Konstante versteht man eine Variable die Konstant ist.
const std::string str = "hallo";
Unter einer Variable versteht man einfach eine Variable.
std::string = "hallo";
Unter einem Literal versteht man etwas Konstantes, das nicht durch eine Konstante repräsentiert wird, sondern hartcodiert ist.
"hallo" (wie z.B. bei cout << "hallo";
-
Lisa88 schrieb:
danke für die Antworten... jetzt bin ich aber noch verwirrter
Vielleicht mal so herum:
Was ist der Unterschied zwischen einer String-Variablen und eine String-Konstanten?
Eigentlich das, was out geschrieben hat.
Ich gehe aber davon aus, dass der Text das meint, was ich geschrieben habe.
Geht es vielleicht um folgendes?string a, b; if (a == b) // klappt if (a == "Hallo") // klappt char str[10]; if (a == str) // klappt if (str == "Hallo") // klappt nicht
Wenn ja, dann meinen die das, was ich geschrieben habe, obwohl die Begriffe sehr falsch verwendet wurden. Bei deinem Buch würd ich also vorsichtig sein.
-
Lisa88 schrieb:
1. Was ist eine "string-Variable"?
Ich nehme mal an, damit ist eine Instanz der String Klasse gemeint, auch bekannt als C++ String.
std::string str("test"); str = "test2";
Variabel, weil der Wert verändert werden kann.
Lisa88 schrieb:
3. Was ist ein " C-String"?
In C wird ein String als Array aus char (bzw. wchar_t im Falle von Unicode, aber erstmal unwichtig) bestimmt.
char a[] = {'T', 'e', 's', 't', '\0'}; char b[] = "Test";
Da die Größe eines Arrays nicht von ihm selbst zu erfahren ist, wird das Ende eines Strings durch das Zeichen '\0' definiert, sodass Funktionen, die mit diesem arbeiten, nicht "über das Ziel hinaus schießen".
Lisa88 schrieb:
2. Was ist eine "string-Konstant"?
Man könnte nun annehmen, es handele sich wie im ersten Fall um einen C++ String, nur dass der Wert als konstant definiert wurde.
const std::string str("test"); str = "test2"; // Ungültig!
Andernseits könnte auch ein Literal aus C gemeint sein.
const char* lit = "Hello";
Der C String "Hello" wäre hierbei nicht auf dem Heap oder Stack, nein, er wäre Bestandteil des Programmcodes.
-
Da die Größe eines Arrays nicht von ihm selbst zu erfahren ist
Doch!?
Manchmal braucht man einen c-style string, z.B. für fstreams.
Seit C++11 zum Glück nicht mehr.
Dann kannst du aus einem std::string einen c-string machen mit str.c_str()
Ergänzung: Außerdem möglich mit
str.data()
, das ist der allgemeine Zugriff auf ein C-Style Array mit selbem Inhalt von sequentiellen STL-Containern.
-
Arcoth schrieb:
Da die Größe eines Arrays nicht von ihm selbst zu erfahren ist
Doch!?
Der Array bzw. die Adresse dessen Speichers verrät es nicht, du beziehst dich auf den Compiler, welcher im Scope der Array-Erstellung über sizeof noch die Byte-Größe wiedergeben kann. Im Falle eines C-Strings gibt man aber nicht dessen Größe immer wieder mit, da diese mithilfe des Terminierungszeichen ermittelbar ist, der Exkurs war für einen Anfänger nicht nötig
-
Youka schrieb:
Arcoth schrieb:
Da die Größe eines Arrays nicht von ihm selbst zu erfahren ist
Doch!?
Der Array bzw. die Adresse dessen Speichers verrät es nicht, du beziehst dich auf den Compiler, welcher im Scope der Array-Erstellung über sizeof noch die Byte-Größe wiedergeben kann. Im Falle eines C-Strings gibt man aber nicht dessen Größe immer wieder mit, da diese mithilfe des Terminierungszeichen ermittelbar ist, der Exkurs war für einen Anfänger nicht nötig
genau genommen nicht nur im scope der array-erstellung:
#include <iostream> #include <cstddef> template<std::size_t Size> void f(int (&Array)[Size]) { // Ein anderer Scope std::cout << sizeof(Array) / sizeof(*Array) << '\n'; std::cout << Size << '\n'; } int main() { int Foo[5]; f(Foo); { // Auch ein anderer Scope std::cout << sizeof(Foo) / sizeof(*Foo) << '\n'; } }