Char array text zuweisen

hallo,
ich lerne mir gerade c++ und ich denke ich hab was ganz elementares nicht verstanden, bin aber aus google&co nicht so ganz schlau geworden…
folgender programmausschnitt:

char *IrgendeinText;
char NochMehrText[30];

IrgendeinText=„Das geht“;
NochMehrText=„Das geht nicht“;

//man könnte dem array zelle für zelle text zuweisen, also
NochMehrText[0]=‚D‘;
.
.
.//Warum sind hier eigentlich die anderen " verlangt??
//eigentlich ist doch NochMehrText ein zeiger auf das erste feld genauso wie IrgendeinText, insofern müsste man doch mit beiden gleich verfahren können???

THX!

hallo,

char *IrgendeinText;
char NochMehrText[30];

IrgendeinText=„Das geht“;
NochMehrText=„Das geht nicht“;

//man könnte dem array zelle für zelle text zuweisen, also
NochMehrText[0]=‚D‘;
.//Warum sind hier eigentlich die anderen " verlangt??
//eigentlich ist doch NochMehrText ein zeiger auf das erste
feld genauso wie IrgendeinText, insofern müsste man doch mit
beiden gleich verfahren können???

Ein ‚pointer‘ ist eine Variable, die
irgend eine Speicheradresse enthalten
*kann*, ein ‚array‘ ist eine Konstante,
die immer den Anfang eines einmal fest-
gelegten Speicherbereichs enthalten *muß*.

char *IrgendeinText;

Variable ‚IrgendeinText‘, uninitialisiert, enthält
einen unspezifizierten Adresswert.

char NochMehrText[30];

Konstante ‚NochMehrText‘, „zeigt“ auf den
start des 30-byte Bereichs (enthält konstante Adresse)
und bleibt auch dort.

Grüße

CMБ

char *IrgendeinText;

Variable ‚IrgendeinText‘, uninitialisiert, enthält
einen unspezifizierten Adresswert.

char NochMehrText[30];

Konstante ‚NochMehrText‘, „zeigt“ auf den
start des 30-byte Bereichs (enthält konstante Adresse)
und bleibt auch dort.

Danke für die rasche antwort!

Aha, also verstehe ich das richtig, dass *IrgendeinText möglicherweise im Speicher rumgeschoben wird bei Bedarf?
Hm, inwieweit muss ich das berücksichtigen?
Was ich deswegen aber nicht Verstehe ist, warum die Zuweisung

NochMehrText=„Das geht nicht“; //bzw.:
NochMehrText=‚Das geht nicht‘;

einen Fehler produziert und warum es bei einem einzelnen character mit den einzelnen ’ also:

NochMehrText[0]=‚x‘;

funktioniert…
Andersrum, wie würde eine zuweisung aussehen die funktioniert? Ich weis mit string geht es bzw. kann man strcpy verwenden um die zuweisung durchzuführen, aber deswegen verstehe ich noch nicht warum der „simple“ weg ohne der string-klasse nicht funktioniert.

THX

Hallo,

Aha, also verstehe ich das richtig, dass *IrgendeinText
möglicherweise im Speicher rumgeschoben wird bei Bedarf?

Nein. *IrgendeinText ist ein Zeiger auf ein bestimmtes Datenelement. Du kannst einen anderen Wert eingragen, dann zeigt der Zeiger auf einen anderen Speicherbereich. Das ursprünglich gespeicherte Element bleibt wo es ist.

Hm, inwieweit muss ich das berücksichtigen?

Die Frage verstehe ich nicht. Zeiger und der Inhalt von Speicher, auf den ein Zeiger zeigt sind grundsätzlich eben nicht das Selbe.

Was ich deswegen aber nicht Verstehe ist, warum die Zuweisung

NochMehrText=„Das geht nicht“; //bzw.:
NochMehrText=‚Das geht nicht‘;

einen Fehler produziert und warum es bei einem einzelnen
character mit den einzelnen ’ also:

Weil NochMehrText das selbe ist, wie &NochMehrText[0], also eine Speicheradresse auf das erste Element eines Arrays. Einer Adresse kann man nur eine Adresse zuordnen, keinen Array aus Werten.

NochMehrText[0]=‚x‘;

Das ist äquivalent zu *(NochMehrText+0), also der Wert des ersten (C fängt bei Null an zu zählen) Elementes des Arrays, der bei &NochMehrText[0] anfängt.

Andersrum, wie würde eine zuweisung aussehen die funktioniert?
Ich weis mit string geht es bzw. kann man strcpy verwenden um
die zuweisung durchzuführen, aber deswegen verstehe ich noch
nicht warum der „simple“ weg ohne der string-klasse nicht
funktioniert.

char *NochEinText;

NochEinText = „Das geht!“;

Bedenke, dass dabei nicht etwa der String kopiert wird, sondern es wird nur der Zeiger *NochEinText auf den Startwert des Strings „Das geht!“ gesetzt.

Lies Dir am besten mal das Kapitel über Zeiger und Arrays im Kernighan/Ritchie durch.

Gruß

Fritze

Hallo,

Ich weis mit string geht es bzw. kann man strcpy verwenden um
die zuweisung durchzuführen, aber deswegen verstehe ich noch
nicht warum der „simple“ weg ohne der string-klasse nicht
funktioniert.

Weil bei C keine Funktionen zur Verfügung stellt, ganze Strings als einzelne Objekte zu verarbeiten.

Gruß

Fritze

Aha, also verstehe ich das richtig, dass *IrgendeinText
möglicherweise im Speicher rumgeschoben wird bei Bedarf?

Nein. *IrgendeinText muss von dir noch überhaupt mit einer Speicheradresse befüllt werden.

Was ich deswegen aber nicht Verstehe ist, warum die Zuweisung

NochMehrText=„Das geht nicht“; //bzw.:
einen Fehler produziert

Weil NochMehrText ein char[] ist und bereits festgelegt wurde von dir, nämlich durch die Anweisung „char NochMehrText[30];“. Damit hast du einen 30-stelliges char-Array im Speicher an einer ganz bestimmten Adresse angelegt.

„Das geht nicht“ dagegen ist ein anderes char[], das irgendwo anders im Speicher liegt. Wenn du den Inhalt von NochMehrText ändern willst, musst du das char[] selbst ändern, in dem du die Zellen des Arrays änderst. Etwas anderes macht strcpy auch nicht.

NochMehrText=‚Das geht nicht‘;

Das macht keinen Sinn. In Hochkommas gibst du eine einzelne char-Variable an, die im Prinzip ein einziges Byte ist. Der Compiler sollte dir hier sowieso mindestens eine Warnung geben.

und warum es bei einem einzelnen
character mit den einzelnen ’ also:

NochMehrText[0]=‚x‘;

Weil NochMehrText[0] ein char-Wert aus dem char-Array ist. Und diesem einzelnen char-Wert weißt du nun einen neuen Wert, nämlich ‚x‘ zu.

funktioniert…
Andersrum, wie würde eine zuweisung aussehen die funktioniert?

Was soll wie funktionieren? Wenn du mir sagst, was du machen willst, dann kann ich dir auch sagen, wie eine funktionierende Zuweisung aussieht. Meinst du vielleicht sowas?

#include 
#include 

main() {

 char\* IrgendeinText;
 char NochMehrText[30];

 IrgendeinText = "Das geht";
 strcpy(&NochMehrText[0], IrgendeinText);

 //man könnte dem array zelle für zelle text zuweisen, also
 //NochMehrText[0]='D'; 
 //HINWEIS: Etwas anderes macht strcpy auch nicht.

 printf("IrgendeinText = '%s'\n", IrgendeinText);
 printf("NochMehrText = '%s'\n", &NochMehrText[0]);


}

Ich weis mit string geht es bzw. kann man strcpy verwenden um
die zuweisung durchzuführen, aber deswegen verstehe ich noch
nicht warum der „simple“ weg ohne der string-klasse nicht
funktioniert.

Weil bei C keine Funktionen zur Verfügung stellt, ganze
Strings als einzelne Objekte zu verarbeiten.

In C gibt es überhaupt keine Objekte :wink:
Das Problem des Fragestellers ist offenbar, dass er den Unterschied zwischen einem Pointer und einem Array nicht versteht.

Hallo,

Weil bei C keine Funktionen zur Verfügung stellt, ganze
Strings als einzelne Objekte zu verarbeiten.

In C gibt es überhaupt keine Objekte :wink:

Stimmt. Besser formuliert: C bietet keine Funktionen, Strings als Einheit zu verarbeiten.

Das Problem des Fragestellers ist offenbar, dass er den
Unterschied zwischen einem Pointer und einem Array nicht
versteht.

Ja. Als Tipp: Es hilft vielleicht auch, sich das letzte Beispiel mal in einem Debugger anzuschauen und dort jeweils auch Adressen und Inhalte anzeigen zu lassen. Dann mal &NochMehrText[0] einfach durch NochMehrText ersetzen.

Man darf sich übrigens auch eine eigene strcopy Funktion schreiben, so zur Übung mit Zeigern und Arrays herumzuspielen.

Gruß

Fritze