산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

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() 함수의 반환 값은 세 가지 경우로 나뉩니다:

예제 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을 반환합니다.

C 언어

  1. C++ 타입 변환 이해하기: 암시적, 명시적, 캐스팅 기법
  2. C for 루프 마스터: 문법, 작동 원리, 실전 예제
  3. C++ 예외 처리 마스터: try, catch, throw 실전 예제
  4. C# 키워드와 식별자 이해: 규칙, 목록, 모범 사례
  5. C switch 문 마스터: 문법, 흐름, 실전 계산기 예제
  6. C# this 키워드 마스터하기: 용법과 실전 예제
  7. C++ 네임스페이스 마스터하기: 함수 충돌 방지와 코드 구성
  8. C# 리플렉션(Reflection) 마스터하기: 런타임 타입 발견과 동적 프로그래밍
  9. C# 데이터베이스 연결 튜토리얼: SQL Server 연결과 CRUD 작업
  10. C# 캡슐화 마스터하기: 접근 지정자로 코드 보호와 설계 개선