Frage zu strncat
-
Ich schreibe für meinen Mitarbeiter eine kleine DLL die ein Webservice für ihn aufruft. Dieser WS kann natürlich einen Fehler werfen, den ich ihm dann in einem char* (den ich von ihm erhalte) übergeben möchte. Die Länge dieses char* bekomme ich natürlich auch mitgeteilt. Also müsste doch folgendes funktionieren?
void callWS(char* errorMsg, int errorLen) { // Aufruf des WS.. if(error) { const char* s = *soap_faultstring(soap); // hier steht jetzt der Fehler strncat(errorMsg, s, errorLen); } }
Wird in diesem Fall nicht einfach *s in *errorMsg geschrieben? Und zwar maximal errorLen viele Zeichen? Und wenn ja, was passiert mit dem \0 wenn *s länger als errorLen ist? Hängt strncat hinten noch als letzte das \0 selbst an oder müsste ich in diesem fall selbst eines anhängen?
-
man: strncat sagt:
The strcat() function appends the src string to the dest string, over-
writing the null byte ('\0') at the end of dest, and then adds a termi-
nating null byte. The strings may not overlap, and the dest string
must have enough space for the result.Die Länge dieses char* bekomme ich natürlich auch mitgeteilt.
Du meinst den Platz im Speicherbereich dahinter, oder? Gehe davon aus.
Wird in diesem Fall nicht einfach *s in *errorMsg geschrieben?
Ja, das wird einfach geschrieben.
Und zwar maximal errorLen viele Zeichen?
Es werden strlen(s) viele Zeichen geschrieben, plus ein Nullbyte, und eines wird überschrieben.
Und wenn ja, was passiert mit dem \0 wenn *s länger als errorLen ist?
Wenn sich die Verkettung + das Nullbyte nicht ausgehen, fliegen dir Dämonen aus der Nase.
-
Wenn sich die Verkettung + das Nullbyte nicht ausgehen, fliegen dir Dämonen aus der Nase.
Argh, Blödsinn. Das gälte für strcat ohne n. Mit n bist du natürlich auf der sicheren Seite:
If src contains n or more characters, strncat() writes n+1 characters
to dest (n from src plus the terminating null byte). Therefore, the
size of dest must be at least strlen(dest)+n+1.
-
Du meinst den Platz im Speicherbereich dahinter, oder? Gehe davon aus.
Jupp, war blöd von mir ausgedrückt. Ich meine natürlich die Länge des Speicherbereichs der reserviert wurde.
Okay, danke. Ich hatte hier eine andere Funktionsbeschreibung von strncat. Da wurde das mit dem \o nicht erwähnt. Daher meine Frage.
-
Okay, danke. Ich hatte hier eine andere Funktionsbeschreibung von strncat. Da wurde das mit dem \o nicht erwähnt. Daher meine Frage.
Ja, das ist seltsam. Es gibt so viele unvollständige Beschreibungen im Internet, daß man da ordentlich einfahren kann. Die Manpages sind zwar auch nicht das gelbe vom Ei, aber dort steht immerhin wenig Unsinn.
-
stimmt
Da drängt sich mir die Frage auf, ob es da nicht etwas "offizielleres" in dieser Hinsicht gibt? Eine art Referenz.
Das ganze ist doch eigentlich von ANSI standardisiert. Müsste es dann nicht dort auch eine genauere Beschreibung der Funktionen geben? Oder vielleicht beim Compilerhersteller... In meinem Fall wohl gnu (gcc)
-
Der Standard ist natürlich ein guter Anlaufpunkt: such mal nach ISO/IEC 9899. Liest sich aber stellenweise genauso trocken wie andere technische Normen und Gesetze udgl. Ich hab aber trotzdem eine PDF-Ausgabe bei meinen Nachschlagewerken liegen.
In meinem Fall wohl gnu (gcc)
Die GNU-Leute haben viele Erweiterungen eingebaut, manche sind durch C99 obsolet geworden. Das hat mich schon öfter verwirrt, aber meiner Erfahrung nach haben die das immer sauber angemerkt:
http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/C-Extensions.html#C ExtensionsViele hier verweisen auch gerne auf http://www.cplusplus.com/reference/, das dürfte auch nicht schlecht sein.
-
Liest sich aber stellenweise genauso trocken wie andere technische Normen und Gesetze udgl.
Ich wollt's wissen und hab nachgeschlagen:
ISO/IEC 9899:TC2 7.21.3.2 schrieb:
The strncat function appends not more than n characters (a null character and
characters that follow it are not appended) from the array pointed to by s2 to the end of
the string pointed to by s1. The initial character of s2 overwrites the null character at the
end of s1. A terminating null character is always appended to the result. 264) If copying
takes place between objects that overlap, the behavior is undefined.
264) Thus, the maximum number of characters that can end up in the array pointed to by s1 is
strlen(s1)+n+1.Das ist eigentlich auch nicht trockener als die Manpages.
-
Stimmt - das liest sich eigentlich ganz gut und so gibt es keine Missverständnisse.
Besten Dank für die Links! Das ist mal wieder informativ!Ne kleine Frage hab ich noch: Was sind überlappende Strings? (Teil)Strings aus demselben Speicherbereich?
-
Cosh schrieb:
Ne kleine Frage hab ich noch: Was sind überlappende Strings? (Teil)Strings aus demselben Speicherbereich?
Ja, zB
char const *foo = "hallo"; char const *bar = foo + 1;