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
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.
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'.
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.
@ 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
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.
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
> 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.
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.
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.
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
@Rufus, die Mehrzahl der übersetzten Bücher schaffen keine zweite Auflage ;-) P.S. und Ausnahmen bestätigen die Regel.
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.
@ 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
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.
Peter: siehe meinen beitrag/topic: GEFAHR du hast 13 Zeichen => kein \0
Stimmt ja, hab ich ganz übersehen. Also mit > hn1[]="+436644567831"; sollte es immer funktionieren, aber mit > hn1[14]="+436644567831"; auch, oder?
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.
@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.
"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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.