2013-05-05 17 views
5

Perché il strcpy(3) (e strncpy(3)) restituisce il primo argomento? Non vedo come questo aggiunge alcun valore. Invece, spesso preferirei avere il numero di byte copiati restituiti.C: Perché strcpy restituisce la sua argomentazione?

Addendum: cosa dovrei fare quando ho bisogno anche della lunghezza della stringa risultante? Devo davvero implementare la mia versione?

+2

In modo che possa essere utilizzato nel concatenamento di funzioni. –

+1

Sarebbe molto più utile se una variante di 'strcpy()' restituisse un puntatore al byte ''\ 0'' alla fine della stringa. Tuttavia, se la lunghezza controlla tutto prima di eseguire la copia (come dovresti essere sicuro), puoi usare 'memmove()' (o forse 'memcpy()') invece di 'strcpy()'. È solo quando non si dispone di una lunghezza disponibile che non può utilizzarli, ma è verosimilmente non sicuro eseguire la copia se non si conoscono le lunghezze della stringa di origine e del buffer di destinazione. –

risposta

1

Così che si può fare qualcosa di simile

char * str = strcpy(malloc(12), "MyNewString"); 
+5

... il cui pericolo non sarà sfuggito a nessuno che abbia visto la versione di questa risposta con '11' dove è ora' 12'. –

+0

Perché non usare semplicemente strdup? O mancava in quei momenti? – sashoalm

+1

'strdup' è, penso, un'aggiunta degli anni '80, quando C si era già diviso in dialetti. Non era in V7 Unix, non è ancora in ISO C, anche se POSIX lo ha sempre avuto. –

2

Per ragioni storiche. strcpy e amici risalgono ai primi anni settanta, e credo che il caso destinazione d'uso per il valore di ritorno sarebbe una sorta di concatenamento:

// copy src into buf1 and buf2 in a single expression 
strcpy(buf1, strcpy(buf2, src)); 

O

char *temp = xmalloc(strlen(const_str) + 1); 
function_that_takes_mutable_str(strcpy(temp, const_str)); 
+0

Non avevano espressioni di virgola al momento? 'function1 ((strcpy (buf1, const_str), buf1))'. –

+1

@JoSo: Non sono sicuro di quando sono state introdotte le espressioni di virgola, ma ho letto un bel po 'di vecchio codice C e non penso di averlo mai visto usato. Personalmente non lo uso mai, tranne nei macro. –

0

maggior parte delle funzioni di stringa nel La libreria C è stata progettata da dilettanti. Ad esempio, nei miei 25 anni di carriera, non ho mai usato la funzione strcat(), tuttavia concatenavo stringhe tutto il tempo. Inoltre, se si pensa a printf(), c'è poca documentazione se si passa NULL per un argomento% s. Lo stesso vale per il% c che passa un '\ 0' o un malloc (0).

Purtroppo, lo strcpy più utile() dovrebbe restituire un puntatore alla fine del buffer di destinazione alla copia a catena.