2013-05-05 16 views
5

Dlaczego strcpy(3) (i strncpy(3)) zwraca pierwszy argument? Nie widzę, jak to dodaje żadnej wartości. Zamiast tego często wolałbym, aby zwrócono liczbę skopiowanych bajtów.C: Dlaczego strcpy zwraca argument?

Dodatek: Co mam zrobić, gdy potrzebuję również długości wynikowego ciągu znaków? Czy naprawdę muszę wdrożyć własną wersję?

+2

Dzięki czemu można go używać w łańcuchach funkcji. –

+1

Byłoby znacznie bardziej przydatne, gdyby wariant 'strcpy()' zwrócił wskaźnik do bajtu '0 \'' na końcu łańcucha. Jednakże, jeśli długość sprawdzasz wszystko przed wykonaniem kopiowania (tak, jak powinno być bezpieczne), możesz użyć 'memmove()' (lub może 'memcpy()') zamiast 'strcpy()'. Dzieje się tak tylko wtedy, gdy nie masz dostępnej długości, która nie może ich użyć, ale prawdopodobnie nie jest bezpieczne wykonywanie kopii, jeśli nie znasz długości łańcucha źródłowego i bufora docelowego. –

Odpowiedz

1

Tak, że można zrobić coś takiego

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

... niebezpieczeństwo, które nie uciekłoby nikomu, kto widział wersję tej odpowiedzi z '11', gdzie jest teraz' 12'. –

+0

Dlaczego po prostu nie używać strdup? A może go brakowało w tamtych czasach? – sashoalm

+1

'strdup' jest, jak sądzę, dodatkiem z lat 80., kiedy C już rozdzielił się na dialekty. To nie było w V7 Unix, wciąż nie jest w ISO C, mimo że POSIX zawsze je miał. –

2

ze względów historycznych. strcpy i przyjaciele sięgają wczesnych lat siedemdziesiątych i chyba zamierzony przypadek użycia dla wartości zwracanej byłby rodzaj łączenia:

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

Albo

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

Czy nie mieli oni w tym czasie przecinków? 'function1 ((strcpy (buf1, const_str), buf1))'. –

+1

@JoSo: Nie jestem pewien, kiedy wprowadzono wyrażenia przecinkowe, ale przeczytałem sporo starego kodu C i wydaje mi się, że nie widziałem, żeby był używany. Osobiście również nigdy go nie używam, z wyjątkiem makr. –

0

Większość funkcji ciągów z Biblioteka C została zaprojektowana przez amatorów. Na przykład w ciągu 25 lat mojej kariery nigdy nie używałam funkcji strcat(), ale cały czas łączę ciągi znaków. Jeśli uważasz, że printf(), jest mało dokumentacji, jeśli przekazujesz NULL dla argumentu% s. To samo dotyczy% c przechodzącej przez "\ 0" lub malloc (0).

Niestety, najbardziej przydatne polecenie strcpy() powinno zwrócić wskaźnik do końca bufora docelowego, aby skopiować łańcuch.