2013-05-05 2 views
5

Почему strcpy(3)strncpy(3)) возвращает свой первый аргумент? Я не вижу, как это добавляет какую-либо ценность. Вместо этого часто я предпочитаю возвращать количество скопированных байтов.C: Почему strcpy возвращает свой аргумент?

Добавление: Что я должен делать, когда мне нужна длина результирующей строки? Действительно ли мне нужно реализовать свою собственную версию?

+2

Чтобы его можно было использовать в цепочке функций. –

+1

Было бы гораздо полезнее, если бы вариант 'strcpy()' возвращал указатель на '' \ 0'' байт в конце строки. Тем не менее, если вы проверяете все до того, как копируете (как и должны быть в безопасности), вы можете использовать 'memmove()' (или, возможно, 'memcpy()') вместо 'strcpy()'. Это происходит только тогда, когда у вас нет доступной длины, которая не может их использовать, но, возможно, небезопасно выполнять копирование, если вы не знаете длины исходной строки и целевого буфера. –

ответ

1

Так что вы можете сделать что-то вроде

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

... от опасности, которой не удалось избежать тех, кто видел версию этого ответа с '11', где' 12' сейчас. –

+0

Почему бы просто не использовать strdup? Или это было в те времена? – sashoalm

+1

'strdup', я думаю, дополнение 1980-х годов, когда C уже расходился с диалектами. Это было не в V7 Unix, это все еще не в ISO C, хотя POSIX всегда это делал. –

2

по историческим причинам. strcpy и друзья датируются начале семидесятых, и я предполагаю, что предполагаемый случай использования для возвращаемого значения будет своего рода цепочки:

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

Или

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

Разве у них не было запятых в то время? 'function1 ((strcpy (buf1, const_str), buf1))'. –

+1

@JoSo: Я не уверен, когда были введены выражения для запятой, но я прочитал довольно много старого кода на C, и я не думаю, что когда-либо видел, что он используется. Я лично и никогда не использую его, кроме макросов. –

0

Большинство строковых функций в C библиотека была разработана любителями. Например, за 25 лет моей карьеры я никогда не использовал функцию strcat(), но все время конкатенировал строки. Кроме того, если вы считаете, что printf() есть небольшая документация, если вы передаете NULL для аргумента% s. То же самое происходит и для% c, передающего '\ 0', или malloc (0).

К сожалению, наиболее полезная функция strcpy() должна возвращать указатель в конец целевого буфера для цепного копирования.

Смежные вопросы