+1 Daumen
1,4k Aufrufe

Hallo zusammen!

Ich habe gerade ein Problem mit einer Online-Übung für unser C- Praktikum. Habe zunächst 1, 3 und 6 als richtig angekreuzt. Das ist falsch. Dann habe ich 1 und 3 angekreuzt, auch falsch! Außerdem noch weitere Möglichkeiten. Könnt ihr mir vielleicht helfen? In dieser Übung fehlt mir nur noch diese Frage. =/



Welche der folgenden String-Definitionen ist korrekt?
1) char s5[] ={ 'b', 'e', 'g', 'i', 'n', 'n', 'e', 'n', '\0' };
2) char s1[3] = "Die";
3) char s4[] ={ 'j', 'e', 't', 'z', 't' };
4) char s3[10] = "können";
5) char s2[] = "Übungen";
6) char s6[] = {'!','0'};



Avatar von

2 Antworten

+7 Daumen
 
Beste Antwort

Aloha :)

1) ok. Das Array s5 wird mit den einzelnen Buchstaben initialisiert, inklusive NUL am Ende.

2) falsch. Das Array s1 hat nur Platz für 3 chars, der String "Die" hat aber 4 chars, wegen NUL am Ende.

3) falsch. Es fehlt NUL am Ende der Initialisierungsliste.

4) ok. Das Feld s3 ist 10 Bytes groß, es wird mit "können" initialisiert, inkl. NUL am Ende, die übrigen 3 Bytes werden NUL gesetzt.

5) ok. Das Feld s2 wird mit "Übungen" inkl. NUL am Ende initialisiert.

6 falsch. Das Feld s6 wird mit einem Ausrufezeichen und der Ziffer 0 initialisiert, es fehlt das NUL am Ende.

Avatar von

Danke für die ausführlichen Erklärungen, es hat geklappt! =)

Du scheinst das genauer zu kennen. Pluspunkt von mir.

Hast du einen guten Link, in dem explizit steht, dass sich das hier alles auf Definitionen von Strings in C (und nicht z.B. in C++) bezieht?

Zu 4) . Wozu dient NUL? Kann man damit tabellenförmige Ausgaben erzeugen?

In C sind alle Strings Nullterminiert. Das heißt, jedem String wird ein \0 angehängt und das wird im Speicher abgelegt. Gibt man nun den Strings aus, wird immer nur bis zum letzten Zeichen vor dem \0 gelesen. Das ist das Begrenzungszeichen. Alle weiteren Zeichen bleiben dann unbeachtet.

Man kann mitten in ein Char-Feld ein \0 einfügen, und der Rest fällt automatisch weg, weil er nicht mehr gelesen wird. Er steht aber dennoch im Speicher. Ist natürlich nicht wirklich Speicher-effizient.

Hallo Lu :)

In C sind Stings als Arrays vom Typ char realisiert. Als Kennzeichen für das Stringende werden diese char-Arrays mit dem Nullbyte NUL ('\0') abgeschlossen. Fast alle C-Bibliotheksfunktionen erwarten dieses NUL als Stringende-Kennzeichen. Fehlt es, kann es zu Speicherzugriffsfehlern kommen, weil die Bibliotheksfunktionen so lange im Speicher lesen, bis sie das erste NUL finden.

Eine Besonderheit sind konstante Strings, die in Anführungszeichen stehen, etwa "Die", "können" und "Übungen" aus der Aufgabe. Diese werden vom Compiler in einen separaten Speicherbereich am Ende des Programms als char-Arrays abgelegt, wobei der Compiler das NUL-Byte automatisch ergänzt. Immer wenn im Programm dann ein konstanter String auftaucht, trägt der Compiler einen const-Zeiger auf diesen Speicherbereich im Programm ein.

Bei der Aufgabe musste man daher wissen, dass Strings in C zwingend ein NUL am Ende brauchen und wie die Initialisierung von Arrays erfolgt. Bei fehlender Array-Größe reserviert der Compiler exakt so viel Platz wie für die Initialisierungsliste nötig ist und kopiert(!) die Elemente aus der Initialisierungsliste in das Array. Ist eine Array-Größe angegeben, reserviert der Compiler exakt diese Größe und kopiert(!) die Elemente aus der Initialisierungsliste in das Array, bis es zur angegebenen Größe aufgefüllt ist. Sind zu viele Elemente in der Initialisierungsliste werden sie einfach ignoriert, sind zu wenig Elemente in der Initialisierungsliste wird mit dem 0-Wert des entsprechenden Datentyps (bei char also NUL) aufgefüllt.

Das kann man übrigens gut nutzen, um Arrays in C zu initialisieren.

int a[100] erzeugt ein Array a mit Platz für 100 int-Werte, aber es findet keine Initialisierung statt.

int a[100]= {0} erzeugt ebenfalls ein Array a mit Platz für 100 int-Werte, kopiert die Initialisierungsliste in das Array, setzt also a[0]=0, und füllt dann bis zum Ende des Array mit den Nullwerten vom Typ int auf. Also wird das ganze Array mit Nullen initialisiert.

Danke für eure Erklärungen.

Gehe ich richtig in der Annahme, dass das eigentliche Definieren mit char geschieht und die Strings nachher mit ihren Namen s1, s2, s3... aufgerufen und nötigenfalls werden?

Es gibt in C keinen Datentyp String. Eine Zeichenkette ist ein einfaches Char-Array.

Aber wie jede Variable hat auch ein Char-Array einen Namen, über den man schnell auf den Speicher zugreifen kann, ohne sich die Adresse zu merken.

Also auf die initialisierte Variable

char[] s1 = "Ein String";
kann man über
s1

zugreifen.

Den Namen s1 vergeben bedeutet bei mir "s1 definieren".

Daher wohl meine Begriffsverwirrung bei  der Frage nach "String definieren".

Hat sich aber geklärt, denke ich.

+1 Daumen

Gemäss http://www.c-howto.de/tutorial/strings-zeichenketten/

könnte 2), 4) und 5) passen als Definition.

2 und 4 sind aber falsch, da sie mit Hilfe von Zahlen in [] auf einen Expliziten "Buchstaben" im String zugreifen.

Daher bleibt eigentlich nur noch 5) .

Ohne Gewähr! Konsultiere auch https://de.wikipedia.org/wiki/Zeichenkette#Syntax_für_Literale

Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community