mikrocontroller.net

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


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Foobla Foobar (foobla)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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'.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian (Guest) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rufus,

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

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian (Guest) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter:
siehe meinen beitrag/topic: GEFAHR

du hast 13 Zeichen => kein \0

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt ja, hab ich ganz übersehen.

Also mit

> hn1[]="+436644567831";

sollte es immer funktionieren, aber mit

> hn1[14]="+436644567831";

auch, oder?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, is logisch, danke an alle!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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'

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.