Non capisco perché usate strncpy con il numero di caratteri della stringa da copiare... a quello ci pensa già da sola, il numero di caratteri specificato serve semplicemente come limitatore per non sforare dal buffer. Lì bisogna metterci le dimensioni del buffer di destinazione, non quelle della stringa da copiare.
Per inciso, poi, strncpy non sarebbe neanche la funzione corretta per questo scopo, dato che era nata inizialmente per le stringhe a lunghezza fissa non necessariamente NUL-terminate come le stringhe in alcune strutture (link), e infatti riempie tutti gli spazi rimanenti con un NUL (inutile per le stringhe C, basta un solo NUL) e soprattutto nel caso in cui la stringa da copiare sia grande come il buffer, non NUL-termina la stringa di destinazione, ed è il motivo per cui spesso si vede roba del tipo
codice:
char buffer[255];
strncpy(buffer,stringa,sizeof(buffer));
buffer[sizeof(buffer)-1]=0;
.
La funzione giusta da utilizzare in questi casi sarebbe la strlcpy, che purtroppo non è standard e non è sempre disponibile; è comunque possibile implementarla in maniera molto semplice (non l'ho provata, ma dovrebbe essere ragionevolmente corretta):
codice:
size_t mystrlcpy(char * dest, const char * src, size_t max)
{
size_t n;
for(n=0;*src && n<max; src++, dest++, n++)
*dest=*src;
*dest=0;
return n;
}
in alternativa, si può semplicemente azzerare la lunghezza della stringa di destinazione e usare la strncat, che invece funziona in maniera sensata:
codice:
char buffer[255];
/* ... */
*buffer=0;
strncat(buffer, stringa, sizeof(buffer));
.