Jaki jest pożytek ze zwracanej wartości strcat()? Czasami standardowe funkcje są tym, czym są określone, a nie tym, czym powinny .
DevSolar
4
@MatthieuM .: Ponadto zwrot kosztów jest zazwyczaj niezerowy. Nawet jeśli zwracana wartość mieści się w rejestrze, generalnie trzeba załadować tę wartość do rejestru. Ma to jednak niewielki koszt.
NPE
15
@sharptooth: Funkcja „zabij wszystkich ludzi” zwróciłaby oczywiście liczbę zabitych ludzi.
indyw
2
@MatthieuM .: Ty nie martwiłbym się o takiej ciekawostki, ale ja na pewno może. Co jeśli piszę kompilator dla systemu z ograniczonymi zasobami? Hmmm?
Thomas Eding,
Odpowiedzi:
36
Podpis jest zgodny ze wszystkimi innymi podobnymi funkcjami: memcpy(), strcpy()itd. Zawsze myślałem, że to zostało zrobione w celu umożliwienia jeden do połączeń łańcuchowych do takich funkcji, a także w inny sposób korzystać z takich połączeń w wyrażeniach.
To powiedziawszy, nigdy nie spotkałem się z sytuacją w świecie rzeczywistym, w której czułbym się zmuszony do wykorzystania wartości zwracanej w taki sposób.
Tak, to zdecydowanie przypadek użycia „łańcuchowego”.
Cartesius00,
6
Głosowałem za odpowiedzią, bo to ciekawy przypadek. Ale w prawdziwym życiu myślę, że lepiej jest trzymać połączenia memset i strcpy oddzielnie.
Tsvetomir Dimitrov
26
Programiści C uwielbiają nieczytelny kod, więc pozwolenie na nieskończone tworzenie łańcuchów jest koniecznością podczas projektowania standardowej funkcji.
Chad Schouggins,
@ChadSchouggins Przeczytaj trochę kodu haskell i wiesz, że c-programiści są w rzeczywistości całkiem dosłownie;) (myśli o wyrażeniu regularnym "operator" = ~) ...
BitTickler
Oczywiście w tym przykładzie byłoby nawet bardziej sensowne, odwrotnie, gdyby strcpywskaźnik znalazł się poza ostatnio skopiowanym plikiem. memset(my_strcpy(a, "bla"), 0, a + 200);(jak std::copy_ni std::fill_nzrób w C ++).
alfC
12
Aby użyć funkcji jako argumentu dla innej funkcji, takiej jak sprintf
strcat()
? Czasami standardowe funkcje są tym, czym są określone, a nie tym, czym powinny .Odpowiedzi:
Podpis jest zgodny ze wszystkimi innymi podobnymi funkcjami:
memcpy()
,strcpy()
itd. Zawsze myślałem, że to zostało zrobione w celu umożliwienia jeden do połączeń łańcuchowych do takich funkcji, a także w inny sposób korzystać z takich połączeń w wyrażeniach.To powiedziawszy, nigdy nie spotkałem się z sytuacją w świecie rzeczywistym, w której czułbym się zmuszony do wykorzystania wartości zwracanej w taki sposób.
źródło
Może być używany do łączenia połączeń, takich jak:
char a[200]; strcpy(memset(a, 0, 200), "bla");
źródło
strcpy
wskaźnik znalazł się poza ostatnio skopiowanym plikiem.memset(my_strcpy(a, "bla"), 0, a + 200);
(jakstd::copy_n
istd::fill_n
zrób w C ++).Aby użyć funkcji jako argumentu dla innej funkcji, takiej jak
sprintf
źródło
Natknąłem się na to pytanie, szukając w Google, aby zobaczyć, jaki memset powrócił.
Mam kod, w którym testuję dla jednej wartości, a jeśli to prawda, sprawdź, czy wartość jest zerowa.
Ponieważ w C nie ma całkowicie przenośnego sposobu na testowanie zer, muszę uruchomić memset w środku.
Więc mój kod to:
if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )
Odpowiada to celowi łączenia w łańcuchy wymienionemu w poprzednich pytaniach, ale jest to przykład zastosowania tej techniki.
Zostawię to innym, aby ocenili, czy to jest dobre kodowanie, czy nie.
źródło