문자열 포인터

C언어에서의 문자열 표현은 별도의 표현이 정해져 있지 않고 char 형 포인터나 배열로 표현된다.

char* str = "proneer";

위와 같이 선언을 한 경우 다음과 같이 값을 변경하려고 하면 오류가 발생한다.

*str = 'd';
문자열 "proneer"는 상수라는 점 때문이다.

위 문장처럼 명시적으로 프로그래머가 메모리를 할당하지 않고 문자열 상수를 사용하여 문자열을 선언하는 경우에는 주의해야 한다. 문자열 상수 선언 후 상수라는 것을 잊은채 포인터를 사용하여 문자열의 내용을 변경하려고 시도하는 경우가 있을 수 있기 때문이다.

이 경우, 사소한 문제 같지만 프로그램에는 치명적인 에러로 작용하여 바로 실행이 중단된다. 따라서 상수로 쓰여질 문자열이 아니라면 배열을 이용해 정의하는 방법을 권장한다.



널(\0)문자란?
널 문자는 문자열 끝에 들어가는 문자로, 문자열의 끝을 알려주는 문자라고 볼 수 있습니다. 예를 들어, 크기가 100인 char형의 배열의 경우 배열 내 실제 문자열이 저장된 개수는 배열 크기보다 작을 수가 있다. 이 경우, 배열 몇번째 까지 문자열이 존재하는지 알려주어야 하는데 이 역할을 널문자가 해 준다.

문자열은 널문자로 끝나야지만 제대로 사용할 수가 있다. 문자열을 복사하는 경우 배열의 크기는 문자열 크기보다 하나이상 커야 하는데 그 이유는 널문자를 삽입해야 하기 때문이다. 표기상 널문자는 '\0'와 같이 표현하지만 실제 값은 정수 0이다. 배열 내 특정 항목에 널 문자를 대입하고 싶은 경우, 0을 사용해도 동일하게 동작한다. 하지만 관습적으로 '\0'을 사용하므로 '\0'을 사용하는 편이 더 좋다.



포인터 변수로 문자열 다루기
문자열을 포인터 변수를 이용해 사용하는 방법 역시 앞서 살펴본 포인터의 사용방법과 별 차이가 없다.


위와 같은 경우 다음과 같은 출력을 얻게 된다.

proneer
proneer
proneer
proneer
ptr + 1 => roneer
ptr + 2 => oneer
ptr + 3 => neer



포인터 변수에 첨자 사용하기
char str[] = "proneer.tistory.com";
char* ptr = str;

printf("%s\n", &ptr[2]);

포인터의 *는 배열의 대괄호([])와 동일한 의미를 가지며 간혹 서로 바꿔서 사용할 수도 있다. 위와 같은 경우 다음과 같은 출력을 얻게 된다.

oneer.tistory.com



포인터를 사용한 여러가지 문자열 조작함수
포인터를 이용해 문자열을 조작하는 법을 알아보았다. 그럼 포인터를 이용해 C언어에서 표준함수로 제공하고 있는 문자열 조작함수를 작성해 보자.

strcpy
문자열을 복사하는 함수이다.

strcat
기존 문자열 끝에 새로운 문자열을 덧붙이는 함수이다.


strlen
문자열의 길이를 반환하는 함수이다.


strcmp
두 문자열을 비교하는 함수이다. 두 문자열이 동일하다면 0을 반환하고, str1이 str2보다 크면 1을 반환, 반대로 작으면 -1을 반환한다. 크다는 의미는 문자열의 길이가 더 길거나, 만일 길이가 같다면 첫 번째 문자부터 서로 비교하여 처음으로 다른 문자를 만났을 때 아스키코드 값이 큰 경우를 의미한다.


strrev
문자열을 역순으로 만드는 함수이다.


strupr
문자열을 대 문자로 변환해주는 함수이다.


strlwr
문자열을 소문자로 변환해주는 함수이다.


Reference : C/C++ 개발자를 위한 KIN 포인터 실무


[프로그래밍/_ C/C++] - [C언어] 포인터와 const 키워드
[프로그래밍/_ C/C++] - [C언어] void 형 포인터
[프로그래밍/_ C/C++] - [C언어] 널포인터(NULL)
[프로그래밍/_ C/C++] - [C언어] 포인터의 포인터
[프로그래밍/_ C/C++] - [C언어] 포인터 배열
[프로그래밍/_ C/C++] - [C언어] 배열과 포인터
Posted by Proneer

댓글을 달아 주세요

  1. 좋은 정보 감사합니다!

    2011.06.05 17:40 [ ADDR : EDIT/ DEL : REPLY ]