프로그램을 짜다보면 문자열을 반환하는 함수를 만들어야 할 때가 있습니다.
사실 파이썬에선 문자열 반환이 간단한 편인데, C에서는 어떨까요?
어떤 형식으로 반환을 해야 문자열 반환이 가능할까요?
const char* string() {
return "Hello World!";
}
int main(void) {
printf("%s", string());
}
위와 같이 const char* 형식으로 반환을 하면 됩니다.
왜 그럴까요?
사실 c에서 문자열이라는 것은 char 데이터로 이루어진 배열을 뜻하게 됩니다. 그렇다면 그 문자열을 가리키는 주소값은 어떤 값을 가리키고 있을까요?
c에서 배열을 사용하는 것과 똑같은데, 바로 문자열 제일 처음을 가리키게 됩니다. 그렇게 되므로써 %s를 만나고 '\0' 값을 만날 때까지 출력이 되는겁니다.
즉, 문자열 포인터는 문자열 전체를 가리키는게 아닌 처음을 가리키는 것이죠.
그렇다면 우리는 리턴 값을 문자열 포인터로 넘긴 것이고, 그 포인터를 %s 입력값으로 출력을 하게 되면서, 'Hello World!' 문자를 출력할 수 있게 된 것입니다.
그렇다면 const는 무슨 의미일까요?
저희는 리턴 값을 "Hello World"라는 문자열을 두었습니다. 이 문자열은 저희가 변경할 수 없는 "상수"이기에 const라는 속성을 부여하게 된 것입니다.
그렇다면 const를 안 붙히려면 어떻게 하면 될까요?
아마 아래와 같이 하고 싶으실 겁니다.
#include <stdio.h>
char* string() {
char str[50] = "Hello World!";
return str;
}
int main(void) {
printf("%s", string());
}
하지만 이렇게 해버리면 전혀 다른 값이 출력하게 됩니다.
그렇기에 저희는 정적 변수 선언 static을 같이 붙혀줘야 합니다.
#include <stdio.h>
char* string() {
static char str[50] = "Hello World!";
return str;
}
int main(void) {
printf("%s", string());
}
그렇다면 여기선 또 왜 static을 붙히게 되었을까요?
static을 붙히지 않으면 char str[5] = "Hello World!"라는 값이 함수 내부에서만 scope를 가지게 됩니다. 즉, 함수를 빠져나오면서 저희가 부여한 value값을 잃어버리게 되는 것입니다.
따라서 static을 붙혀주게 되므로서, 값을 잃지 않고 유지를 해올 수 있습니다.
이 부분에 대해서 자세히 알고 싶으시면 전역 변수, 지역 변수, 정적 변수를 공부하시는 것을 추천드립니다.
아직 저도 C의 부족한 점이 많습니다. 혹시나 글에서 잘 못된 점을 발견하시면 댓글로 남겨주시길 바랍니다.
이상 C에서 문자열 반환하는 함수 만들기였습니다. ^_^
'C > 개념' 카테고리의 다른 글
scanf의 맹점 (2) / 입출력 속도 (0) | 2019.12.12 |
---|---|
scanf의 맹점 / 입력 버퍼 (0) | 2019.12.10 |
"const char *" 형식의 값을 사용하여 "char *" 형식의 엔터티를 초기화할 수 없습니다. - 에러 수정 (5) | 2019.12.02 |
Hash 구현 (0) | 2019.08.18 |
Hash 알고리즘 (0) | 2019.08.10 |