Forum: Mikrocontroller und Digitale Elektronik Grundlegende Frage zu Strings in C


von Peter (Gast)


Lesenswert?

Hallo!

Ich hab da mal eine grundlegende Frage:

Also in C werden ja Strings mit \0 abgeschlossen. Muss ich, wenn ich 
jetzt z.B. "Hallo" in einen String speichern will, dann den String mit:

> char feld[4];

oder

> char feld[5];

oder

> char feld[6];

deklarieren?

4 Stellen weil von 0-4 oder
5 Stellen, weil von 0-4 mit \0 oder
6 Stellen, weil von 1-5 mit \0?

Wäre echt dankbar, wenn ihr mir helfen könntet.

lg Peter

von Foobla F. (foobla)


Lesenswert?

Arrays fangen mit dem Index 0 an in C. Allerdings schreibt man
bei der Deklaration die wirkliche Länge hin.
Um also "Hallo\0" zu speichern brauchst du nen char array
mit 6 Plätzen.
Also char feld[6] deklarieren.

von Christian (Gast)


Lesenswert?

Richtig ist:

char feld[6];

Damit reservierst Du 6 Bytes für den String und das abschließende 
Nullbyte. Der Index läuft dabei von 0 bis 5 (6-1). feld[0] wäre also 
z.B. 'H', feld[4] wäre 'o'.

von Uhu U. (uhu)


Lesenswert?

char feld[6];

Du kannst aber auch einen kleinen Trick machen, der das Zählen erspart:

char feld[] = "Hallo";

Dann werden für feld 6 chars reserviert.

von Falk B. (falk)


Lesenswert?

@ Peter

>Ich hab da mal eine grundlegende Frage:

>Also in C werden ja Strings mit \0 abgeschlossen. Muss ich, wenn ich
>jetzt z.B. "Hallo" in einen String speichern will, dann den String mit:

Ist die Bibliothek oder das Internet abgebrannt? Das wir in JEDEM 
Grundlagenbuch beschrieben
Für eine String mit N Zeichen brauchst du logischer weise N+1 Bytes. Für 
"Hallo" also

char feld[6];

Wenn du den gleich initialisierst sparts du dir das Zählen.

char feld[]="Hallo";

Die \0 wird automatisch drangehängt.

>Wäre echt dankbar, wenn ihr mir helfen könntet.

Grundlagen dieser Art erarbeitet man sich besser in Büchern.

MFG
Falk

von Werner B. (Gast)


Lesenswert?

Da leider die Mehrzahl der "C"-Bücher nur miserabel, und teilweise sogar 
falsch, aus den Englischen übersetzt sind, ist es durchaus legitim solch 
grundlegende Fragen zu stellen. Zudem ich aus eigener Erfahrung weiss 
dass man als erfahrener Programmierer solch wesentliche Dinge beim 
Erklären oft übersieht. Nicht aus bösem Willen, sondern weil sie einem 
in Fleisch und Blut übergegangen sind und darum zu selbstverständlich um 
daran überhaupt noch einen Gedanken zu verschwenden.

von Peter (Gast)


Lesenswert?

Danke!

Da drängt sich mir aber noch eine Frage auf:

Ich hab mal gehört, dass man

> char feld[]="Hallo";

nicht machen sollte, sondern:

> char feld[6];
> strcpy(feld, "Hallo");

Geht das die erste Version auch ohne Probleme?

lg Peter

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Da leider die Mehrzahl der "C"-Bücher nur miserabel, und teilweise sogar
> falsch, aus den Englischen übersetzt sind ...

Das trifft für den K&R in der zweiten Auflage nun definitiv nicht zu. 
Und den gibt es auch schon seit sehr, sehr langer Zeit, nämlich so seit 
Ende der 80er Jahre.

von Uhu U. (uhu)


Lesenswert?

Peter wrote:
>> char feld[]="Hallo";
>
> nicht machen sollte,

Ich wüßte nicht warum. Das wird vom Linker erledigt und kostet zur 
Laufzeit nix.

> sondern:
>
>> char feld[6];
>> strcpy(feld, "Hallo");
>
> Geht das die erste Version auch ohne Probleme?

Das erzeugt Code - einen Funktionsaufruf und eine Stringkonstante - und 
kostet ein wenig Rechenzeit.

Wenn man feld nachträglich auf einen anderen Wert setzen will, dann 
kopiert man.

von Christian (Guest) (Gast)


Lesenswert?

Zitat:
"Für eine String mit N Zeichen brauchst du logischer weise N+1 Bytes."

Logisch?
... ich finde den Satz lustig, ;-).
N+1 wegen der "\0".
Aber dann wird doch nur [N] beim Array eingetragen - logisch?

Das ist einfach die C-Konvention,
die natürlichen Zahlen fangen halt bei 1 an:
  "1 apfel, 2 Äpfel"
C-ler zählen ab 0:
  "0 Apfel, 1 Äpfel"


Die GEFAHR beim Falschmachen ist:
dass ohne \0 ggf. weitergelesen wird, also ein
längerer String erkannt wird vom Programm.

"falk": ich hoffe, mein zitieren wird akzeptiert:
  ansonsten SORRY!
Ich wollte das mit dem Array deutlicher machen

Gruss, c.

von Peter (Gast)


Lesenswert?

Ich das aber vorher so gemacht:

Und zwar deklarierte ich 3 Strings:

> xdata volatile char hn1[13]="+436644567831";
> xdata volatile char hn2[13]="+436642145864";
> xdata volatile char hn3[13]="+436648751236";

Und wenn ich jetzt hn1 über RS232 schicke, steht am anderen Ende 
folgendes:

> +436644567831+436642145864+436648751236@

Also das funktionierte nicht.

Liegt es daran, dass ich hn1[13] und nicht hn1[] geschrieben habe, oder 
woran sonst?

lg Peter

von Werner B. (Gast)


Lesenswert?

@Rufus,

die Mehrzahl der übersetzten Bücher schaffen keine zweite Auflage ;-)

P.S. und Ausnahmen bestätigen die Regel.

von Karl H. (kbuchegg)


Lesenswert?

Werner B. wrote:
> Da leider die Mehrzahl der "C"-Bücher nur miserabel, und teilweise sogar
> falsch, aus den Englischen übersetzt sind,

kein Einwand, aber

> ist es durchaus legitim solch
> grundlegende Fragen zu stellen.

Nein. Tut mir leid. Wenn ein C Buch solche Dinge nicht richtig
oder gar nicht beschreibt, dann kriegt es bei der erstbesten
Buchbesprechung aber eine derart miserable Bewertung, gepaart
mit EMails an den Verlag und an den Autor, dass der Verlag froh
ist, wenn er es wieder vom Markt ziehen kann.

von Falk B. (falk)


Lesenswert?

@ Christian

>>"Für eine String mit N Zeichen brauchst du logischer weise N+1 Bytes."

>Logisch?
>... ich finde den Satz lustig, ;-).

Informatikerlogik. ;-)

>Das ist einfach die C-Konvention,
>die natürlichen Zahlen fangen halt bei 1 an:
>  "1 apfel, 2 Äpfel"
>C-ler zählen ab 0:
>  "0 Apfel, 1 Äpfel"

Nöö, das ist "Hausfrauenlogik", die den Unterschied zwischen Anzahl und 
Index nicht kennt.

@Peter

>Und zwar deklarierte ich 3 Strings:

>> xdata volatile char hn1[13]="+436644567831";
>> xdata volatile char hn2[13]="+436642145864";
>> xdata volatile char hn3[13]="+436648751236";

Uuups, das sind EXAKT 13 Zeichen, da kann der Compiler keine 0 mehr 
reinquetschen, ggf. meckert er da sogar.

>Und wenn ich jetzt hn1 über RS232 schicke, steht am anderen Ende
>folgendes:

>> +436644567831+436642145864+436648751236@

>Also das funktionierte nicht.

Wieso? Das Programm macht exakt das, was du ihm sagst.

>Liegt es daran, dass ich hn1[13] und nicht hn1[] geschrieben habe, oder
>woran sonst?

Ja.

MFG
Falk

von Karl H. (kbuchegg)


Lesenswert?

Peter wrote:
> Ich das aber vorher so gemacht:
>
> Und zwar deklarierte ich 3 Strings:
>
>> xdata volatile char hn1[13]="+436644567831";
>> xdata volatile char hn2[13]="+436642145864";
>> xdata volatile char hn3[13]="+436648751236";
>
> Und wenn ich jetzt hn1 über RS232 schicke, steht am anderen Ende
> folgendes:
>
>> +436644567831+436642145864+436648751236@
>
> Also das funktionierte nicht.

Zähl doch mal die Zeichen in deinen Strings


    "+436644567831";

     1234567890123
     0000000000111

Da sind 13 Zeichen. Dazu dann noch das obligate '\0' Zeichen
macht in Summe 14 Zeichen und nicht 13.

Genau deshalb sollst du schreiben:

xdata volatile char hn1[]="+436644567831";

denn dann zählt nämlich der Compiler den String ab.
Und im Gegensatz zu dir macht er dabei keinen Fehler.

von Christian (Guest) (Gast)


Lesenswert?

Peter:
siehe meinen beitrag/topic: GEFAHR

du hast 13 Zeichen => kein \0

von Peter (Gast)


Lesenswert?

Stimmt ja, hab ich ganz übersehen.

Also mit

> hn1[]="+436644567831";

sollte es immer funktionieren, aber mit

> hn1[14]="+436644567831";

auch, oder?

von Karl H. (kbuchegg)


Lesenswert?

Peter wrote:
> Stimmt ja, hab ich ganz übersehen.
>
> Also mit
>
>> hn1[]="+436644567831";
>
> sollte es immer funktionieren, aber mit
>
>> hn1[14]="+436644567831";
>
> auch, oder?

ja.
Oder jede andere Zahl, solange sie nur größer als 13 ist.

von Werner B. (Gast)


Lesenswert?

@Rufus,

> ...wieder vom Markt ziehen...

<Sarkasmus>
wer daran glaubt, glaubt auch an den Osterhasen oder ist Politiker 
(Politiker == von einem anderen Planeten; [evtl. von der neuen 
entdeckten Supererde?!])
</Sarkasmus>

Sogar die guten Verlage (z.B. "O'R..." den ich für den Besten in diesem 
Bereich halte) haben nicht immer kompentente Übersetzter. Zum Glück 
stehen hier beim Buchhändler oft die Originalausgaben neben den 
Übersetzung im Bücherregal. Das macht allerdings wiederum den Markt für 
deutsche Übersetzungen kleiner, und damit für den Verlag 
uninteressanter. Ein Teufelskreis.

von Peter (Gast)


Lesenswert?

Ok, is logisch, danke an alle!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"wieder vom Markt ziehen" ist nicht von mir.

Die deutsche Übersetzung der zweiten Auflage des K&R erschien im 
Hanser-Verlag. Geringe Fehlerquote, sachlich, lesbar.

(Ganz im Gegensatz zur ersten Auflage, die wie mit einem Automaten 
übersetzt wirkte und auch sehr unglücklich gesetzt war).

Deutsche Übersetzungen von Büchern von O'Reilly sind hingegen in der Tat 
oft grottig, die will man im Original lesen.

von Karl H. (kbuchegg)


Lesenswert?

Werner B. wrote:
> @Rufus,
>
>> ...wieder vom Markt ziehen...
>
> Sogar die guten Verlage (z.B. "O'R..." den ich für den Besten in diesem
> Bereich halte) haben nicht immer kompentente Übersetzter.

Stimmt alles.
Aber wir reden hier nicht von Raketentechnik.
Wir reden von einem Kapitel 'Strings in C'

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.