리턴형이 char * 아니면 void ?

gogisnim의 이미지

string.h 에 있는 str~ 류의 함수들 리턴형이 char * 인것이 많습니다.
strcpy 같은 경우 char *strcpy(char *dest, const char *src); 인것처럼요.

어차피 포인터를 파라미터로 넘기니 리턴값을 굳이 char *로 안해주고 void 로 해줘도 될거 같은데요.

#include

void strCpy(char *dest, const char *src) {
while ( *dest++ = *src++) ;
}

int main() {
char buf[100];
char *str="korea";

strCpy(buf, str);
printf("res : %s\n", buf);
return 0;
}

이렇게 구현해도 되는데 굳이 리턴형을 char * 로 한 이유가 있나요?
아님 그냥 관례상?

익명사용자의 이미지

여러모로 쓸모 있습니다.

dst 를 리턴해주면 바로

printf("res : %s\n", strcpy(buf, str));

가능합니다.

strcat 의 경우 joel 이 쓴 러시아 페인트 공 이야기 보시면 명확합니다

http://www.joelonsoftware.com/articles/fog0000000319.html

zipsinworm의 이미지

좀 더 정확히 하면 void 가 아니라 void* 이 겠지요. 함수의 리턴형을 써 주는 이유는 그 함수가 어떠한 값을 돌려주는지 알기 위해서 써줍니다. 물론 함수가 포인터를 리턴할 경우 모두 void* 로 해도 상관은 없지만 그렇게 되면 함수의 리턴 값을 받을때 일일이 변환을 해줘야 하는 경우가 생기게 됩니다. 위 소스는 void* 라고 해도 상관은 없지만 시스템 함수들이 모두 void*로 되어 있다면 과연 어떤 값을 반환하는지 알 수 없겠죠. 한 예로 malloc 함수를 사용할 경우 변수 형에 맞게금 모두 캐스팅을 합니다.

klara의 이미지

질문하신분은 void*를 잘못써서 void로 쓴게 아니라 아예 값을 반환할 필요가 없다는 뜻으로 void를 쓴거 같네요;

전웅의 이미지

> string.h 에 있는 str~ 류의 함수들 리턴형이 char * 인것이 많습니다.
> strcpy 같은 경우 char *strcpy(char *dest, const char *src); 인것처럼요.
>
> 어차피 포인터를 파라미터로 넘기니 리턴값을 굳이 char *로 안해주고 void 로 해줘도 될거 같은데요.
>
> #include
>
> void strCpy(char *dest, const char *src) {
> while ( *dest++ = *src++) ;
> }
>

참고로, 이식성을 고려해 strcpy() 함수를 C 언어로 구현할 경우 unsigned
char 형으로 접근해 문자열을 복사해야 합니다.

> int main() {
> char buf[100];
> char *str="korea";
>
> strCpy(buf, str);
> printf("res : %s\n", buf);
> return 0;
> }
>
> 이렇게 구현해도 되는데 굳이 리턴형을 char * 로 한 이유가 있나요?
> 아님 그냥 관례상?
>

무의미하게 버려질 수 있는 반환값 자리를 통해 유용한 의미를 제공하는
것으로 생각하시면 됩니다. str*() 함수가 void 형이 공식적으로 도입된
표준 C 언어 이전부터 존재했다는 점을 감안하면, 어차피 존재해야 하는
반환형을 통해 어떤 의미있는 결과를 넘겨주려 하는 것이 자연스러운
선택임을 이해할 수 있습니다.

추가로 str*() 함수의 반환값에 한가지 불만스러운 점은 쉽게 얻을 수 있는
문자열 처음 위치가 아닌 보다 많은 비용이 필요한 문자열 마지막 위치를
결과로 주지 않는다는 점입니다 - 그만큼 초기 설계에 많은 고민이 투자된
함수로 보기는 어렵습니다.

예를 들어 아래 코드를 보시기 바랍니다.

strcat(strcpy(buf, path), name);
 
xstrcpy(xstrcpy(buf, path), name);

xstrcpy() 가 strcpy() 와 행동은 동일하지만 결과로 복사한 문자열의
마지막 위치를 반환해 준다고 한다면, 아래 함수가 보다 효율적으로 원하는
행동을 제공해준다는 것을 알 수 있습니다.

같은 맥락에서 적은 개수의 짧은 문자열을 연결할 때에는 strcat() 함수를
사용하는 것에 큰 비용이 들지 않지만, 여러 개의 문자열을 연결하고자
하는 경우에는 적절한 초기화와 함께 루프 안에서

strcpy(s += strlen(s), str[i]);

와 같은 형태로 문자열을 복사해 나가는 것이 보다 효율적입니다.

물론, str*() 함수의 반환 결과는 오래전에 굳어진 것이라 표준화가
이루어질 무렵에는 이미 바꾸기에 늦어버린 상황이었습니다.

--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org (서버 공사중)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.