문자열은 포인터 변수로 굉장히 많이 사용합니다.
일반적은 문자 배열과 다른 면을 비교해보겠습니다.
*리터럴(literal)이란 변하지않는 데이터를 뜻합니다. 프로그램이 실행돼도 정대 변하지 않습니다.
ex) int a=1; 에서 1이 리터럴입니다. 리터럴도 결국에는 메모리를 사용합니다.
포인터 변수는 메모리의 주소값을 저장하는 방식의 변수입니다.
char *st = "안녕하세요";
포인터는 선언과 초기화를 동시에도 하지만
char *st2;
st2 = "어서오세요";
선언 후 나중에 대입이 가능합니다.
변수처럼 값을 변경하는게 아닌 포인터 변수는 주소를 변경한다는 의미라 중간에 새롭게 리터럴(literal) 문자열을 대입할 수 있습니다.
포인터 변수에 저장된 리터럴 문자열은 읽기전용입니다.
그렇기 때문에 문자 배열처럼 각각의 인덱스의 값을 변경할 수 없습니다.
배열처럼 인덱스를 각각 출력은 가능합니다.
char *st = "abcd";
//st[0]='f'; //불가능
printf("%c", st[0]); //가능
포인터는 기본적으로 메모리가 할당되어있지 않기 때문에
strcpy()처럼 문자열에 사용하던 함수들이 에러가 나는 경우가 있습니다.
그래서 포인터에 메모리를 할당해서 문자열 함수를 사용할 수 있습니다.
이 방법을 '동적 메모리 할당'이라고 합니다.
먼저 동적 메모리 할당을 하기 위해서는 malloc()을 사용해야 합니다.
그러기 위해서는 표준 라이브러리 stdlib.h를 선언해야 합니다.
예제를 보겠습니다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char *st = "안녕하세요";
char *st2 =malloc(sizeof(char)*20); //동적 메모리 할당
strcpy(st2, st);
printf("%s 의 길이 = %d \n", st2, strlen(st2));
free(st2); //할당된 메모리 해제
return 0;
}
포인터 st2에 동적 메모리 할당으로 char*20만큼의 메모리를 할당했습니다.
저장할 메모리를 확보했으니 strcpy를 이용해서 문자열을 복사해서 저장할 수 있습니다.
그리고 할당한 메모리가 더 이상 쓸모없다면 free()로 꼭 해제해 주세요. 메모리 누수가 발생합니다.
*동적 메모리 할당은 다른 자료형및 구조체등의 포인터에서도 사용할 수 있습니다.
strtok()도 포인터를 사용할 수 있습니다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char st[] = "show me the money";
char *st2tk;
st2tk = strtok(st, " ");
while (st2tk != NULL) {
printf("%s \n", st2tk);
st2tk = strtok(NULL, " ");
}
}
st2tk = strtok(NULL, " ");는 문자열이 인자로 들어가야 할 자리에 NULL을 넣게 되면 분리된 다음 문자열을 읽어서 기준 문자열로 다시 분리시킵니다.
st2tk != NULL은 strtok()은 더이상 나눌 문자열이 없으면 NULL을 반환하기 때문에 분리될 문자가 없을 때까지 반복해서 문자열을 분리하라는 의미입니다.
'공부 자료실 > C언어' 카테고리의 다른 글
C언어 - 문자열 변환 (0) | 2020.06.30 |
---|---|
C언어 - 문자,문자열의 입력, 출력 (0) | 2020.06.30 |
C언어 - 문자열 (0) | 2020.06.29 |
C언어 - 구조체 (0) | 2020.06.27 |
C언어 - 배열 (0) | 2020.06.23 |
댓글