Vayn,
Geekoaur has answered your question well, I'm just pointing out another "problem" with your code.
The line s1[strlen(s1)] = '\0';
is a no-op if s1
is allready properly null terminated BEFORE it executes.
But if s1
is NOT allready properly null terminated BEFORE this line executes (and you're unlucky) it will cause:
- a SIGSEGV on a POSIX (*nix) system.
- a GPF on Windows.
This is because strlen
basicaly finds the index of the existing null-terminator and returns it! Here's a valid, unoptimized implementation of strlen:
int strlen(char *string) {
int i = 0;
while(string[i] != '\0') {
++i;
}
return i;
}
So... If you're REALLY worried about strings NOT being null-terminated then you'd do something like:
string[sizeof(string)]='\0';
on local automatic strings (where the compiler "knows" the size of the string);
- or
string[SIZE_OF_STRING]
for all other strings, where SIZE_OF_STRING
is (most commonly) a #define
'd constant, or a variable which you maintain specifically to store the current-SIZE (not length) of a dynamically allocated string.
And if you're REALLY, REALLY, REALLY worried about strings not being null-terminated (like you're dealing with "dirty" libary methods (like Tuxedo's ATMI for example) you ALSO "clear" your "return strings" before passing them to the suspect library methods with:
- before:
memset(string, NULL, SIZE_OF_STRING);
- invoke:
DirtyFunction(/*out*/string)
;
- after:
string[SIZE_OF_STRING]='\0'
SIG11's are a complete biatch to find because (unless you "hook" them with a signal-processor and say otherwise, they cause unix to hard-terminate your program, so you can't log anything (after the fact) to help figure out where-in-the-hell-did-that-come-from... especially considering that in many cases the line of code which throws the SIG11 is no-where-near the actual cause of the string loosing it's null-terminator.
Does that make sense to you?
Cheers mate. Keith.
PS: WARNING: strncpy
does NOT allways nullterminate... you probably meant strlcpy
instead. I learned this the hard way... when a 60 million dollar billing run crashed.
EDIT:
FYI: Here's a "safe" (unoptimized) version of strlen which I'll call strnlen
(I reckon this should be in stdlib. Sigh.).
// retuns the length of the string (capped at size-1)
int strnlen(char *string, int size) {
int i = 0;
while( i