C언어 문자 포인터와 함수 활용 완벽 가이드
C언어에서 문자 포인터란?
문자 포인터는 문자 타입의 주소 또는 문자 배열(문자열)의 첫 번째 문자의 주소를 저장합니다. 문자열을 조작할 때 문자 포인터는 매우 유용합니다.
C언어에는 별도의 문자열 데이터 타입이 없습니다. 'char' 타입의 배열이 문자열로 간주되므로, char 타입 배열을 가리키는 포인터가 곧 문자열을 나타냅니다. 이 char 포인터는 함수의 인자로 전달되어 문자열을 처리하는 데 사용됩니다.
문자 포인터 선언하기
문자 포인터는 문자 또는 문자 배열을 가리킵니다. 선언 문법은 다음과 같습니다:
char *pointer_name;
문자 포인터 초기화하기
문자 포인터를 선언한 후에는 문자 변수의 주소로 초기화해야 합니다. 문자 배열이 있는 경우, 배열 이름이나 첫 번째 요소의 주소를 제공하여 간단히 초기화할 수 있습니다.
단일 문자를 가리키는 문자 포인터
문자 타입 변수를 가리키는 포인터 초기화 문법:
char *pointer_name = &char_variable;
문자 배열(문자열)을 가리키는 문자 포인터
문자 배열을 가리키는 포인터 초기화 문법:
char *pointer_name = char_array; /*또는*/ char *pointer_name = &char_array[0];
문자 포인터 예제
다음 예제에서는 문자 변수와 문자 배열 두 개를 선언하고, 각각의 주소를 저장하는 두 개의 포인터 변수를 만든 뒤 포인터를 통해 값을 출력합니다.
#include <stdio.h>
int main() {
// 변수 선언
char x = 'P';
char arr[] = "TutorialsPoint";
// 문자 포인터 선언 및 초기화
char *ptr_x = &x;
char *ptr_arr = arr;
// 값 출력
printf("Value of x : %c\n", *ptr_x);
printf("Value of arr: %s\n", ptr_arr);
return 0;
}
실행 결과
Value of x : P
Value of arr: TutorialsPoint
문자 포인터 심층 이해
문자열은 다음과 같이 배열로 선언됩니다:
char arr[] = "Hello";
문자열은 널(NULL) 문자로 끝나는 문자 배열입니다. 위 배열의 마지막 요소는 널 문자(\0)입니다.
char 타입 포인터를 선언하고 0번째 문자의 주소를 할당합니다:
char *ptr = &arr[0];
배열 이름 자체가 0번째 요소의 주소임을 기억하세요.
char *ptr = arr;
배열 변수 대신 포인터를 사용하여 문자열을 선언할 수도 있습니다(대괄호 없이).
char *ptr = "Hello";
이 경우 문자열이 메모리에 저장되고 그 주소가 ptr에 저장됩니다. 포인터를 증가시키며 문자열을 순회할 수 있습니다.
while(*ptr != '\0'){
printf("%c", *ptr);
ptr++;
}
문자 배열 접근하기
%s 서식 지정자를 사용해 문자 포인터 이름으로 문자 배열 전체를 출력할 수 있습니다. 하지만 배열의 각 문자에 개별적으로 접근하려면 문자 포인터 이름 앞에 별표(*)를 붙이고 증가시켜야 합니다.
예제 1: 문자 단위 출력
#include <stdio.h>
int main(){
char arr[] = "Character Pointers and Functions in C";
char *ptr = arr;
while(*ptr != '\0'){
printf("%c", *ptr);
ptr++;
}
}
실행 결과
Character Pointers and Functions in C
예제 2: %s로 한 번에 출력
#include <stdio.h>
int main(){
char arr[] = "Character Pointers and Functions in C";
char *ptr = arr;
printf("%s", ptr);
}
실행 결과
Character Pointers and Functions in C
문자 포인터를 사용하는 문자열 함수들
"string.h" 헤더 파일에는 문자열 길이 구하기, 복사, 비교 등 문자열 처리를 위한 다양한 라이브러리 함수가 정의되어 있습니다. 이 함수들은 char 포인터를 인자로 받습니다.
strlen() 함수
strlen() 함수는 문자열의 길이, 즉 문자 개수를 반환합니다. 함수 원형은 다음과 같습니다:
int strlen(char *)
예제 1: 문자열 길이 출력
#include <stdio.h>
#include <string.h>
int main(){
char *ptr = "Hello";
printf("Given string: %s \n", ptr);
printf("Length of the string: %d", strlen(ptr));
return 0;
}
실행 결과:
Given string: Hello
Length of the string: 5
예제 2: 사용자 정의 함수로 strlen() 구현
#include <stdio.h>
#include <string.h>
int str_len(char *);
int main(){
char *ptr = "Welcome to Tutorialspoint";
int length = str_len(ptr);
printf("Given string: %s \n", ptr);
printf("Length of the string: %d", length);
return 0;
}
int str_len(char *ptr){
int i = 0;
while(*ptr != '\0'){
i++;
ptr++;
}
return i;
}
실행 결과:
Given string: Welcome to Tutorialspoint
Length of the string: 25
strcpy() 함수
대입 연산자(=)로는 문자열 값을 문자열 변수(char 포인터)에 할당할 수 없습니다. 대신 strcpy() 함수를 사용해야 하며, 원형은 다음과 같습니다:
char * strcpy(char * dest, char * source);
예제 1: strcpy() 사용법
#include <stdio.h>
#include <string.h>
int main(){
char *ptr = "How are you doing?";
char *ptr1;
strcpy(ptr1, ptr);
printf("%s", ptr1);
return 0;
}
strcpy() 함수는 대상 문자열 ptr1의 포인터를 반환합니다.
How are you doing?
예제 2: 사용자 정의 str_cpy()로 구현
#include <stdio.h>
#include <string.h>
void str_cpy(char *d, char *s);
int main(){
char *ptr = "Using the strcpy() Function";
char *ptr1;
str_cpy(ptr1, ptr);
printf("%s", ptr1);
return 0;
}
void str_cpy(char *d, char *s){
int i;
for(i = 0; s[i] != '\0'; i++)
d[i] = s[i];
d[i] = '\0';
}
실행 결과:
Using the strcpy() Function
이 함수는 소스 문자열의 각 문자를 널 문자 "\0"에 도달할 때까지 대상 문자열로 복사합니다. 루프 종료 후 대상 배열 끝에 "\0" 문자를 추가합니다.
strcmp() 함수
일반적인 비교 연산자(<, >, <=, >=, ==, !=)로는 두 문자열을 비교할 수 없습니다. 대신 "string.h" 헤더의 strcmp() 함수를 사용합니다. 함수 원형:
int strcmp(char *str1, char *str2)
strcmp() 함수의 반환 값은 세 가지 경우로 나뉩니다:
- 두 문자열이 동일하면 0을 반환합니다.
- str1에서 처음 다른 문자의 ASCII 값이 str2의 해당 문자보다 크면 양수를 반환합니다. 이는 str1이 사전순으로 str2 뒤에 있음을 의미합니다.
- str1에서 처음 다른 문자의 ASCII 값이 str2의 해당 문자보다 작으면 음수를 반환합니다. 이는 str1이 사전순으로 str2 앞에 있음을 의미합니다.
예제 1: strcmp() 사용법
#include <stdio.h>
#include <string.h>
int main(){
char *s1 = "BASK";
char *s2 = "BALL";
int ret = strcmp(s1, s2);
if (ret == 0)
printf("Both strings are identical\n");
else if (ret > 0)
printf("The first string appears after the second string \n");
else
printf("The first string appears before the second string \n");
return 0;
}
실행 결과:
The first string appears after the second string
s1을 "BACK"으로 변경하고 다시 실행하면:
The first string appears before the second string
예제 2: 사용자 정의 str_cmp()로 구현
#include <stdio.h>
#include <string.h>
int str_cmp(char *str1, char *str2);
int main(){
char *s1 = "The Best C Programming Tutorial Available Online";
char *s2 = "The Best C Programming Tutorial Available Online";
int ret = str_cmp(s1, s2);
if (ret == 0)
printf("Both strings are identical\n");
else if (ret > 0)
printf("The first string appears after the second string\n");
else
printf("The first string appears before the second string\n");
return 0;
}
int str_cmp(char *str1, char *str2) {
while (*str1 != '\0' && *str2 != '\0') {
if (*str1 != *str2) {
return *str1 - *str2;
}
str1++;
str2++;
}
// 두 문자열이 같으면 0 반환
return 0;
}
실행 결과:
Both strings are identical
str_cmp() 함수는 두 문자열의 같은 인덱스에 있는 문자를 비교하며, 어느 한쪽 문자열이 끝나거나 문자가 다를 때까지 계속합니다. 다른 문자를 발견하면 두 문자의 ASCII 값 차이를 반환하고, 루프가 정상 종료되면 0을 반환합니다.