Qual é a utilidade do valor de retorno de strcat()? Às vezes, as funções padrão são o que devem ser, não o que deveriam ser.
DevSolar
4
@MatthieuM .: Além disso, geralmente há um custo diferente de zero associado à devolução de coisas. Mesmo se o valor de retorno couber em um registro, geralmente você precisa carregar esse valor no registro. Isso tem um custo, embora pequeno.
NPE
15
@sharptooth: Uma função "matar todos os humanos" retornaria o número de humanos mortos, é claro.
indiv
2
@MatthieuM .: Você não se preocuparia com essas trivialidades, mas eu certamente me preocuparia . E se eu estiver escrevendo um compilador para um sistema de recursos limitados? Hmmm?
Thomas Eding
Respostas:
34
A assinatura está em linha com todas as outras funções semelhantes: memcpy(), strcpy()etc. Eu sempre achei que isso foi feito para permitir um para chamadas cadeia para tais funções, e de outra forma utilizar tais chamadas em expressões.
Dito isso, nunca me deparei com uma situação do mundo real em que me sentisse compelido a usar o valor de retorno dessa maneira.
Sim, é definitivamente o caso de uso de 'encadeamento'.
Cartesius00
6
Eu votei a resposta, porque é um caso interessante. Mas, na vida real, acho melhor manter as chamadas memset e strcpy separadas.
Tsvetomir Dimitrov
24
Os programadores de C adoram código ilegível, portanto, permitir o encadeamento infinito é uma necessidade ao projetar uma função padrão.
Chad Schouggins
@ChadSchouggins Leia algum código haskell e você saberá que os programadores c são na verdade bastante literalmente;) (pensa em regex "operador" = ~) ...
BitTickler
Claro que neste exemplo teria feito mais sentido até, ao contrário, para strcpyretornar o ponteiro após o último copiado. memset(my_strcpy(a, "bla"), 0, a + 200);(como std::copy_ne std::fill_nfazer em C ++).
alfC de
12
Para usar a função como um argumento para outra função, como sprintf
strcat()
? Às vezes, as funções padrão são o que devem ser, não o que deveriam ser.Respostas:
A assinatura está em linha com todas as outras funções semelhantes:
memcpy()
,strcpy()
etc. Eu sempre achei que isso foi feito para permitir um para chamadas cadeia para tais funções, e de outra forma utilizar tais chamadas em expressões.Dito isso, nunca me deparei com uma situação do mundo real em que me sentisse compelido a usar o valor de retorno dessa maneira.
fonte
Pode ser usado para encadeamento de chamadas como:
fonte
strcpy
retornar o ponteiro após o último copiado.memset(my_strcpy(a, "bla"), 0, a + 200);
(comostd::copy_n
estd::fill_n
fazer em C ++).Para usar a função como um argumento para outra função, como
sprintf
fonte
Eu me deparei com essa pergunta ao pesquisar no Google para ver o que o conjunto memset retornou.
Eu tenho algum código onde teste um valor, então, se for verdade, teste para ver se um valor é zeros.
Como não existe uma maneira totalmente portátil em C de testar zeros, tenho que executar o memset no meio.
Então, meu código é:
Isso se refere ao propósito do encadeamento listado nas questões anteriores, mas é um exemplo de uso para essa técnica.
Vou deixar para os outros julgarem se essa codificação é boa ou não.
fonte