Forum: PC-Programmierung Char Array in C mit '\0' deklarieren


von Elminjo A. (elminjo)


Lesenswert?

Hallo,

wenn ich ein String deklariere und die einzelnen Felder erst später 
beschreibe muss ich in das letzte Element ein Nullzeichen schreiben.
Ich möchte das Array später ja als String benutzen.

so:
1
    char buf[7];
2
    buf[6] = '\0';

Geht das auch schöner oder ist das so üblich?

von Mikro 7. (mikro77)


Lesenswert?

Kann man so machen. Viele Wege führen nach Rom.

Alternativen wären u.a. ...
-- gar nicht initialisieren; erst wenn es gebraucht wird einen gültigen 
string schreiben (bspw. mit strcpy)
-- komplett mit Nullen initialisieren: char buf[7] = { 0 } ;
-- wenn es ein Dezimalcounter werden soll, mit dem Startwert 
initialisieren: char buf[] = "000000" ;

Kommt halt drauf an was du machen willst. :-)

von Elminjo A. (elminjo)


Lesenswert?

Danke,

1. und 3. sind klar
aber bei 2. mit
1
 char buf[7] = { 0 } ;
 hätte ich gedacht ist dasselbe:
1
 char buf[] = { '0', '0', '0', '0', '0', '0', '0'};
 fehlt dann nicht das Nullzeichen '\0'?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Elminjo A. schrieb:
> aber bei 2. mit
1
 char buf[7] = { 0 } ;
 hätte ich gedacht ist
> dasselbe:
1
 char buf[] = { '0', '0', '0', '0', '0', '0', '0'};
> fehlt dann nicht das Nullzeichen '\0'?

0 ist identisch mit '\0'. Das ist das NUL-Zeichen - nicht zu verwecheln 
mit NULL aus stdio.h.

'0' ist etwas ganz anderes, nämlich das druckbare ASCII-Zeichen einer 
Null.


Obiges ist also etwas ganz anderes. Da steht:
1
 char buf[7] = { 0 } ;

und nicht
1
 char buf[7] = { '0' } ;

: Bearbeitet durch Moderator
von DirkB (Gast)


Lesenswert?

Frank M. schrieb:
> und nicht
>  char buf[7] = { '0' } ;

... und da wird nur das erste Element mit '0' besetzt. Die restlichen 
sechs werden mit 0 gefüllt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

DirkB schrieb:
> ... und da wird nur das erste Element mit '0' besetzt. Die restlichen
> sechs werden mit 0 gefüllt.

Jepp, das auch noch :-)

von Daniel A. (daniel-a)


Lesenswert?

DirkB schrieb:
> ... und da wird nur das erste Element mit '0' besetzt. Die restlichen
> sechs werden mit 0 gefüllt.

Aber nur im Globalen Scope. In Funktionen sind die Restlichen 
undefiniert.

von Klaus (Gast)


Lesenswert?

Elminjo A. schrieb:
> Danke,
>
> 1. und 3. sind klar
> aber bei 2. mit
1
 char buf[7] = { 0 } ;
 hätte ich gedacht ist
> dasselbe:
1
 char buf[] = { '0', '0', '0', '0', '0', '0', '0'};
> fehlt dann nicht das Nullzeichen '\0'?

Durchaus nicht. Denn
1
'0'

ist das ASCII-Zeichen der Ziffer 0, während
1
0

der Integerwert 0 ist, was dem ASCII-Zeichen NULL entspricht.

Allerdings sollte (wenn ich mich nicht gerade irre oder irgendeine 
Änderung am Standard übersehen habe oder für char arrays ein Sonderfall 
greift)
1
char buf[7] = { 0 };

zum einen nicht alle Arrayelemente mit dem Integerwert 0 
initialisieren - wenn überhaupt, nur das nullte - und zum anderen 
vermutlich eine Warnung bringen, das die Anzahl der Elemente nicht 
übereinstimmt.

An sich sollte das aber für alle üblichen Anwendungen, wie strcyp, 
strlen, strcat usw. völlig hinreichen.

Ganz dumm, aber am geschicktesten, wäre meiner Meinung nach:
1
char buf[7] = "";

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus schrieb:
> der Integerwert 0 ist, was dem ASCII-Zeichen NULL entspricht.

[Korinthe]
NUL mit einem L
[/Korinthe]

von Peter II (Gast)


Lesenswert?

Daniel A. schrieb:
> DirkB schrieb:
>> ... und da wird nur das erste Element mit '0' besetzt. Die restlichen
>> sechs werden mit 0 gefüllt.
>
> Aber nur im Globalen Scope. In Funktionen sind die Restlichen
> undefiniert.

wie kommst du darauf?

von DirkB (Gast)


Lesenswert?

Daniel A. schrieb:
> DirkB schrieb:
>> ... und da wird nur das erste Element mit '0' besetzt. Die restlichen
>> sechs werden mit 0 gefüllt.
>
> Aber nur im Globalen Scope. In Funktionen sind die Restlichen
> undefiniert.

Nein!

Wenn bei der Definition von Arrays nur für eine Teil Werte vorgegeben 
werden, wird der Rest mit 0 gefüllt.

Globale und static Variablen werden immer mit 0 initialisiert, solange 
nichts anderes angegeben wird.

von Klaus (Gast)


Lesenswert?

DirkB schrieb:

> Wenn bei der Definition von Arrays nur für eine Teil Werte vorgegeben
> werden, wird der Rest mit 0 gefüllt.
>
> Globale und static Variablen werden immer mit 0 initialisiert, solange
> nichts anderes angegeben wird.

Dann habe ich was falsches geschrieben. Sorry.

von Mikro 7. (mikro77)


Lesenswert?

Klaus schrieb:
> ...
> Allerdings sollte (wenn ich mich nicht gerade irre oder irgendeine
> Änderung am Standard übersehen habe oder für char arrays ein Sonderfall
> greift)
>
>
1
> char buf[7] = { 0 };
2
>
>
> zum einen nicht alle Arrayelemente mit dem Integerwert 0
> initialisieren - wenn überhaupt, nur das nullte - und zum anderen
> vermutlich eine Warnung bringen, das die Anzahl der Elemente nicht
> übereinstimmt.

Aus ISO/IEC 9899:
1
If there are fewer initializers in a brace-enclosed list than there are elements or members
2
of an aggregate, or fewer characters in a string literal used to initialize an array of known
3
size than there are elements in the array, the remainder of the aggregate shall be
4
initialized implicitly the same as objects that have static storage duration.

[...which means zero-initialized...]

von Daniel A. (daniel-a)


Lesenswert?

Peter II schrieb:
> Daniel A. schrieb:
>> DirkB schrieb:
>>> ... und da wird nur das erste Element mit '0' besetzt. Die restlichen
>>> sechs werden mit 0 gefüllt.
>>
>> Aber nur im Globalen Scope. In Funktionen sind die Restlichen
>> undefiniert.
>
> wie kommst du darauf?

Ich hatte es mit der Initialisierung von Structs und Unions verwechselt:

http://busybox.net/~landley/c99-draft.html#6.7.8
1
#9
2
Except where explicitly stated otherwise, for the purposes of this subclause unnamed members of objects of structure and union type do not participate in initialization. Unnamed members of structure objects have indeterminate value even after initialization.

Aber bei Arrays habt ihr Recht:
1
#21
2
If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.

von Klaus (Gast)


Lesenswert?

S. J. schrieb:
> Klaus schrieb:
>> ...
>> Allerdings sollte (wenn ich mich nicht gerade irre oder irgendeine
> Aus ISO/IEC 9899:

Was soll ich machen? Auf die Kniee fallen? Hatte hier 
Beitrag "Re: Char Array in C mit '\0' deklarieren" 
doch schon geschrieben, dass ich was Falsches behauptete.

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.