2010-05-26 9 views
24

gcc 4.4.4 c89null endet eine Zeichenfolge

Was ist der normale Weg, um eine Zeichenfolge null beenden? Wenn ich die NULL benutze bekomme ich eine Warnmeldung.

*dest++ = 0; 
*dest++ = '\0'; 
*dest++ = NULL; /* Warning: Assignment takes integer from pointer without a cast */ 

Quellcode:

size_t s_strscpy(char *dest, const char *src, const size_t len) 
{ 
    /* Copy the contents from src to dest */ 
    size_t i = 0; 
    for(i = 0; i < len; i++) 
    *dest++ = *src++; 

    /* Null terminate dest */ 
    *dest++ = 0; 

    return i; 
} 

Eine andere Frage: Ich habe absichtlich die Zeile, die beendet null Kommentar gesetzt. Der Inhalt des Zielverzeichnisses wird jedoch korrekt ausgedruckt. Der Aufrufer dieser Funktion würde die Länge der Zeichenfolge entweder mit der Nummer NULL senden oder nicht. d.h. strlen(src) + 1 oder stlen(src).

+13

Ich bevorzuge '* dest ++ = '\ 0'; 'da' '\ 0'' in diesem Zusammenhang den richtigen Typ hat. –

+5

@Paul R: Warum machst du das nicht eine Antwort? – Lucas

+0

'* dest ++ = 0;' Warum post-incrementieren Sie den Zeiger, nachdem Sie den Wert auf Null gesetzt haben? – Larry

Antwort

35

Zu Ihrer ersten Frage: Ich würde mit Paul Rs Kommentar gehen und mit '\0' enden. Aber der Wert 0 selbst funktioniert auch gut. Eine Frage des Geschmacks. Verwenden Sie jedoch nicht den MACRO NULL, der für Zeiger gedacht ist. Wenn Ihre Zeichenfolge nicht mit \0 terminiert ist, wird die erwartete Ausgabe möglicherweise trotzdem gedruckt, da Ihrer Zeichenfolge ein nicht druckbares Zeichen in Ihrem Speicher folgt. Dies ist jedoch ein wirklich böser Fehler, da er explodieren könnte, wenn Sie es nicht erwarten. Immer beenden Sie eine Zeichenfolge mit '\0'.

7

'\ 0' ist der Weg zu gehen. Es ist ein Zeichen, das in einer Zeichenfolge gesucht wird und den Nullwert hat.

Wenn wir null beendete Zeichenfolge in C/C++ sagen, bedeutet es wirklich 'Null terminierte Zeichenfolge'. Das NULL-Makro ist nicht für das Beenden von Zeichenfolgen vorgesehen.

+0

''\ 0'', wenn es ein Charakter ist, ist ein ziemlich großer !. Ich bin mir sicher, dass Sie heute bei den meisten Maschinen mit einem 'C'-Compiler sizeof ('\ 0') == 4 haben. (Vielleicht sind 8031 ​​Mikrocontroller eine Ausnahme?). –

+0

@Joseph.Ich bin mir nicht sicher, woher du kommst. sizeof ('\ 0') kommt als 1 Byte auf meinem Compiler heraus. Für ein Doppel-Byte-Zeichen, sizeof (L '\ 0') ist es 2. –

+6

Ich habe geprüft: in einer .c-Datei ist es 4, in einer .cpp-Datei oder mit g ++ ist es 1. Die Frage war markiert als C, nicht C++. –

11

Be sehr vorsichtig: NULL ist ein Makro, das hauptsächlich für Zeiger verwendet wird. Die Standard Weise eine Reihe von Abschluss ist:

char *buffer; 
... 
buffer[end_position] = '\0'; 

Dieses (unten) funktioniert auch, aber es ist kein großer Unterschied zwischen einem ganzzahligen Wert zu einer int/kurz/lang Array Zuweisen und einen Zeichenwert zugeordnet wird. Deshalb wird die erste Version bevorzugt und persönlich gefällt mir das besser.

buffer[end_position] = 0; 
+0

''\ 0'' ist eine Konstante vom Typ "int" in C. –

17

Vom comp.lang.c FAQ: http://c-faq.com/null/varieties.html

Im Wesentlichen: NULL (der Präprozessormakro für den Null-Zeiger) ist nicht die gleiche wie NUL (das Null-Zeichen).

+8

+1; es nervt mich wirklich die ganze Zeit ich sehe "NULL-terminated strings": heck, der string terminator ist nicht NULL, es ist NUL! –

Verwandte Themen