앞서 작성한 전화번호부 소스의 add 함수에서 strdup 를 이용하여 입력받은 데이터를 저장하는 부분이 있다.
https://blesslee.tistory.com/18
전화번호부 만들기 V1
앞서 학습한 배열과 포인터를 이용하여 간단한 전화번호부 프로그램을 작성하고자 한다. 동작 목표 - 사용자에게 입력받는 부분은 '$ ' 프롬프트를 이용하여 입력받음 - 이름, 전화번호를 저장 -
blesslee.tistory.com
strcpy 는 단순히 (strcpy (a, b)) b에 저장된 문자열을 a에 저장하는 함수이다.
전화번호부 소스처럼 char * 타입 배열에 입력받은 문자열 배열을 저장하려 하면 정상적으로 저장이 되지 않는다.
strdup 는 string.h 헤더파일에 포함된 함수로 내부적으로 배열을 만들고 매개변수로 받은 문자열을 복사하여 반환한다.
입력받은 문자열의 크기 + 1 (문자열+\0 값 입력을 위해) 의 배열을 생성하여 문자열을 복사하여 저장하고 해당 값을 리턴하는 구조로 되어있다.
char * strdup(char * s) { char *p; p = (char *)malloc(strlen(s)+1) if(p != null) strcpy(p, s); return p; } |
입력받은 배열의 주소값(s)을 함수 내부적으로 p라는 배열을 입력받은 s의 문자열길이보다 +1 길이의 배열로 malloc 을 이용하여 동적 메모리 할당을 통해 생성하고 (실제 s 라는 배열은 s[4] 로 선언되어있으며, 'abc' 라는 문자열을 저장하고 있다고 가정하였을 때 strlen(s) 를 통해 길이를 확인하면 3으로 출력된다. 길이가 3인 문자열을 저장하기 위해서는 마지막에 '\0' 문자를 입력하여주어야 정상적으로 입력이 되기 때문에 실제 p 배열을 생성할 때는 +1 하여 생성한다.) strcpy 를 통해서 동적메모리 할당된 p 에 s의 값을 저장한다.
전화번호부 소스에서 strdup 를 사용하는 이유는 C 언어에서 사용되는 변수의 성격에 따른 영향이다.
변수에 관한 부분은 다음 장에서 다루도록 하겠다.
'자료구조' 카테고리의 다른 글
전역변수와 지역변수 (feat. 전화번호부 만들기 V1) (0) | 2022.11.21 |
---|---|
전화번호부 만들기 V1 (0) | 2022.11.21 |
문자열 연습문제 - 2 (0) | 2022.11.17 |
문자열 연습문제 -1 (2) | 2022.11.17 |
문자열 - 3 (0) | 2022.11.17 |