자료실/C언어

C언어 - 문자열과 포인터

자료수집중 2020. 6. 29.
반응형

문자열은 포인터 변수로 굉장히 많이 사용합니다.

일반적은 문자 배열과 다른 면을 비교해보겠습니다.

 

*리터럴(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 != NULLstrtok()은 더이상 나눌 문자열이 없으면 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

댓글