Forum: Mikrocontroller und Digitale Elektronik String in Array speichern --- Fehlermeldung komisch


von Verstehnix (Gast)


Lesenswert?

char stringarray[5] = "Hallo";

--> funktioniert (zumindest kein Compilerfehler)




char stringarray[5] = "Halloa";

--> funktioniert nicht!

Errorwarnung:
Error[Pe144]: a value of type "char [7]" cannot be used to initialize an
entity of type "char [5]"


Nun frage ich mich, wieso durch die Verlängerung meines Strings um einen 
Buchstaben, das Array plötzlich char[7] breit wäre, hingegen vorher ein 
char[5] gewesen ist...



klärt mich bitte auf.

mfg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Verstehnix schrieb:
> char stringarray[5] = "Hallo";

Hier werden 5 Buchstaben ohne das abschließende '\0' gespeichert. Das 
ist halt in C so: Passen nur die Buchstaben, aber nicht mehr die 
Terminierung, dann wird die Terminierung halt weggelassen.

Ergo solltest Du hier besser stringarray[6] schreiben.

> char stringarray[5] = "Halloa";

hier muss der C-Compiler passen: 6 Buchstaben + '\0' als Terminator sind 
insgesamt 7 Zeichen. Die passen beileibe nicht in ein Array, was nur 5 
Zeichen aufnehmen kann.

Schreibe also

    char stringarray[7] = "Halloa";

Aber am besten schreibst Du:

    char stringarray[] = "Halloa";

Dann dimensioniert der Compiler das Array selbst.

Gruß,

Frank

von Verstehnix (Gast)


Lesenswert?

danke

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Das Obere gibt zwar erstmal kein Fehler, aber wenn du den String 
weiternutzen willst obwohl er kein Nullzeichen als Terminierung hat gibt 
das die lustigsten Fehler.
Denn eine Stringverarbeitende Funktion arbeitet bis es ein Nullzeichen 
findet, hier wird dann solange durch dne Speicher geackert bis ein 
anderer String gefundne wird mit Nullzeichen.

von Freddy (Gast)


Lesenswert?

Wenn "Hallo" ein char[5] ist, dann versteh ich auch nicht ganz, wieso 
"Halloa" ein char[7] sein soll. Wäre dann doch eigentlich ein char[6], 
da nur ein Character länger.

Komisch

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frank M. schrieb:
>> char stringarray[5] = "Hallo";
>
> Hier werden 5 Buchstaben ohne das abschließende '\0' gespeichert. Das
> ist halt in C so: Passen nur die Buchstaben, aber nicht mehr die
> Terminierung, dann wird die Terminierung halt weggelassen.
>
> Ergo solltest Du hier besser stringarray[6] schreiben.


Wirklich sinnvoll aber ist es, die redundante Längenangabe einfach 
wegzulassen:

   char stringarray[] = "Hallo";

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Freddy schrieb:
> Wenn "Hallo" ein char[5] ist, dann versteh ich auch nicht ganz, wieso
> "Halloa" ein char[7] sein soll. Wäre dann doch eigentlich ein char[6],
> da nur ein Character länger.

du hast Franks Antwort genau gelesen?

von Verstehnix (Gast)


Lesenswert?

noch eine Anschlussfrage:

Gibt es eine Möglichkeit, eine String-Arraydeklaration durchzuführen, 
die zwar automatisch die Länge festsetzt, aber dabei ohne einen 
Nullterminator wirkt?

Also eine Zeile (sinngemäß):

stringarray[] = "String_und_nur_String_ohne_Nullterminator";



gibt es so eine Möglichkeit?

von Freddy (Gast)


Lesenswert?

Uwe Berger schrieb:
> du hast Franks Antwort genau gelesen?

Ganz offensichtlich nicht ;)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Verstehnix schrieb:
> Gibt es eine Möglichkeit, eine String-Arraydeklaration durchzuführen,
> die zwar automatisch die Länge festsetzt, aber dabei ohne einen
> Nullterminator wirkt?
>
> Also eine Zeile (sinngemäß):
>
> stringarray[] = "String_und_nur_String_ohne_Nullterminator";

Ja, wenn man nicht mit einer Stringkonstanten, sondern einzelnen 
Zeichen initialisiert:

  char stringarray[] = { 'S', 't', 'r', 'i', 'n', 'g' };

Jedes andere Array beliebigen anderen Typs funktioniert auch so.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Verstehnix schrieb:
> gibt es so eine Möglichkeit?
Nicht in C.
Dann müstest du weg von der "String"-schreibweise und hin zur 
'C','h','a','r','a','c','t','e','r'-schreibweise...
Ist es dir das wert?

EDIT: Pech, zweiter... ;-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Rufus Τ. Firefly schrieb:
> Wirklich sinnvoll aber ist es, die redundante Längenangabe einfach
> wegzulassen:
>
>    char stringarray[] = "Hallo";

Du hast mein Posting offenbar nicht bis zum Ende gelesen. Dieses war 
extra didaktisch so aufgebaut, dass genau dieser Clou erst am Ende 
kommt ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.