Alexander U. schrieb:
> Was mich so verwirrt hat, bzw. noch immer tut, ist nämlich:
Was dich verwirrt ist der Unterschied zwischen " und '
" ist für einen kompletten String
' ist für ein einzelnes Zeichen
Weiter hat dich verwirrt der Unterschied zwischen einer Initialisierung
und einer Zuweisung.
Das hier
>
1 | > char readstring[48] = "" ; //Deklarierung funktioniert, Array ist von
|
2 | > Beginn an 0 (sonst Datenmüll)
|
3 | >
|
ist eine Initialisierung. Und hier gelten ein klein wenig andere Regeln
als bei einer Zuweisung. Insbesondere kann man an dieser Stelle ein
Array als ganzes Initialisieren. Und deshalb kann man es hier auch mit
einem String insitialisieren, der ja eine Abfolge von Bytes ist (welches
im weitesten Sinne das Markenzeichen eines Arrays ist).
Deshalb funktioniert das hier.
>
1 | > char readstring[48] = '\0' ; //buildfehler. "A numeric Expression must
|
2 | > appear here"
|
3 | >
|
Logisch. Initialisiert wird ein Array. Syntaxmässig gibst du hier aber
einen Character an. Zumindest versuchst du es. Denn wenn man ein Array
mit einzelnen Werten initialisieren will, dann schreibt sich das so
1 | char text[10] = { 'a', 'b', 'c', '\0' };
|
und das ist eigentlich immer so. Lediglixh für Strings gibt es eine
Ausnahme, weil man das
a) häufig braucht.
b) das in eine Schreiborgie ausartet.
c) schnell unübersichtlich wird.
Anstelle von
1 | char text[10] = { 'a', 'b', 'c', '\0' };
|
welches syntaktisch völlig korrekt ist, ist auch
als kürzere Form erlaubt. Aber mehr steckt da nicht dahinter. Es ist
einfach nur eine Erleichterung der Schreibweise, dass man hier gleich
ein String-Literal als solches angeben kann.
Wohingegen das nächste alles Zuweisungen sind
>
1 | > readstring[3]= "" ; //funktioniert, Stelle 3 ist leer, bzw 0
|
2 | >
|
Und das kann nicht gehen.
Wenn readSstring ein ganzes Array aus Charactern ist, dann ist
readstring[3] ein einzelner Character aus diesem Array. "" ist aber ein
String. Und einen String kannst du nicht in dieser Form zuweisen, schon
gar nicht an einen einzelnen Character. Allgemeiner: Arrays kann man
nicht als ganzes zuweisen. Man kann sie als Einheit initialisieren aber
nicht als Einheit zuweisen. Ein
int i[5], j[5];
i = j;
ist in C illegal. Und auch wenn du in weiteren C-Studien auf Konstrukte
mit Pointern stösst, die fast so aussehen, als ob das gehen würde: Nein,
das tut es nicht - Arrays sind nicht zuweisbar. Wohl aber können es die
einzelnen Elemente eines Arrays sein. In diesem konkreten Fall der
einzelne char.
>
1 | > readstring[3]= '/0' ; //funktioniert, Stelle 3 ist leer, bzw 0
|
2 | >
|
Logisch funktioniert das. Links vom Zuweisungs-= steht der Datentyp
char, rechts davon steht der Datentyp char. Passt also alles zusammen
und die Zuweisung kann gemacht werden.
>
1 | > int i=3;
|
2 | > readstring[i]= "" ; //hat keine Auswirkungen (somit auch keine
|
3 | > Schleife möglich)
|
4 | >
|
Logisch. Der Datentyp links ist wieder ein einzelner Character. Rechts
von = steht aber ein String. Passt nicht.
>
1 | > int i=3;
|
2 | > readstring[i]= '/0' ; //funktioniert, Stelle 3 ist leer, bzw 0
|
3 | >
|
Auch klar. Links ist ein char, rechts ist ein char. Alles paletti.
Du brauchst ein C-Buch. Die Datentypen von Literalen in einem C-Programm
zu erkennen, wenn man sie sieht, sind absolute Grundlagen.
Aber das steht auch im Link zur FAQ, dass " und ' verschiedene Dinge
sind. Scheint so, als ob du das eben nicht alles weißt, was da im Link
steht.