[C 언어] 문자열 처리 함수

💡 문자열을 함수에 전달할 때에는 포인터를 사용하는 것이 좋다!!

  • 함수에 문자열을 직접 전달하는 경우에는 문자열의 크기를 알아야 한다.
  • 그러나 포인터를 사용하면 문자열의 시작 주소만으로도 함수에서 해당 문자열을 참조할 수 있다.
  • 이 방식을 사용하면 메모리의 효율성향상되며, 문자열을 복사하는 오버헤드가 없어진다.

stdio.h

표준 입출력 관련 함수들이 선언된 헤더 파일 (Standard Input/Output Header)

puts()

int puts ( const char *str );
  • 문자열을 출력 하는 함수
  • puts() 함수는 문자열을 출력하고 자동으로 줄 바꿈을 추가

⭐️ Example

#include <stdio.h>

int main() {
    const char *message = "Hello, World!";
    puts(message);

    return 0;
}
>> Hello, World!

gets() & fgets()

char *gets ( char *str );
char *fgets ( char *str, int size, FILE *stream );
  • 사용자로부터 문자열을 입력 받는 함수
  • gets() 함수는 입력을 받아 문자열로 저장하고, 입력이 끝나면 엔터 키 전까지의 문자열을 반환
  • 하지만, gets() 함수는 버퍼 오버플로우와 관련된 보안 취약점을 가지고 있기에 fgets() 함수를 권장
  • fgets() 함수는 두 번째 매개변수로 읽을 최대 문자 수를 지정할 수 있어, 입력 받을 문자열의 길이를 제한할 수 있음

⭐️ Example

#include <stdio.h>

int main() {
    char input[100];
    
    printf("문자열을 입력하세요: ");
    fgets(input, sizeof(input), stdin);

    printf("입력한 문자열: %s\n", input);

    return 0;
}

string.h

문자열 처리 관련 함수들이 선언된 헤더 파일 (String Handling Header)

strlen()

size_t strlen ( const char *str );

인수로 전달된 문자열의 길이를 반환하는 함수

⭐️ Example

#include <string.h>

char str[] = "Welcome";  
printf("이 문자열의 길이는 %d입니다.\n", strlen(str));
>> 이 문자열의 길이는 7입니다.

strcat() & strncat()

char *strcat ( char *destination, const char *source );
char *strncat ( char *destination, char *source, size_t num );
  • 하나의 문자열에 다른 문자열을 연결해주는 함수
  • strcat(): 첫 번째 인수로 전달된 문자열이 기준 문자열이 되고, 두 번째 인수로 전달된 추가하고자 하는 문자열의 복사본기준 문자열 뒤에 추가
  • strncat(): strcat() 함수와 하는 일은 같지만, 세 번째 인수로 추가할 문자열의 최대 길이 지정 가능
  • 배열 오버플로우 현상을 방지하기 위해 strcat() 함수 대신 strncat() 함수를 사용하는 것이 좋다.

⭐️ Example

#include <string.h>

char str01[20] = "C language is "; // 널 문자를 포함하여 15문자
char str02[] = "Cool! and funny!";  

//strcat(str01, str02);   // 이 부분의 주석 처리를 삭제한 후 실행시키면 배열 오버플로우가 발생함
strncat(str01, str02, 5); // 이렇게 최대 허용치를 설정해 놓으면 배열 오버플로우에 대해서는 안전해짐

puts(str01);  // 문자열 출력 함수
>> C language is Cool!

strcpy() & strncpy()

char *strcpy ( char *destination, const char *source );
char *strncpy ( char *destination, const char *source, size_t num );
  • 문자열을 복사하는 함수
  • strcpy(): 첫 번째 인수로 전달된 배열에, 두 번째 인수로 전달된 문자열을 복사
  • strncpy(): strcpy() 함수와 하는 일은 같지만, 세 번째 인수로 복사할 문자열의 최대 길이 지정 가능
  • 배열 오버플로우 현상을 방지하기 위해 strcpy() 함수 대신 strncpy() 함수를 사용하는 것이 좋다.

⭐️ Example

#include <string.h>

char str01[20] = "C is Cool!";
char str02[11];  

// str02 배열의 크기만큼만 복사를 진행하며, 마지막 한 문자는 널 문자를 위한 것임
strncpy(str02, str01, sizeof(str02)-1);
str02[sizeof(str02)-1] = '\0'; // 이 부분을 주석 처리하면, 맨 마지막에 널 문자를 삽입하지 않음

puts(str02);
>> C is Cool!

strcmp() & strncmp()

int strcmp ( const char *str1, const char *str2 );
int strncmp ( const char *str1, const char *str2, size_t num );
  • 문자열의 내용을 비교하는 함수
  • strcmp(): 두 개의 문자열 포인터를 전달받아, 해당 포인터가 가리키는 문자열의 내용을 서로 비교
  • strncmp(): strcmp() 함수와 하는 일은 같지만, 세 번째 인수로 비교할 문자의 개수 지정 가능
  • 첫 번째 인수로 전달된 문자열이 더 큰 경우는 양수, 두 번째 인수로 전달된 문자열이 더 큰 경우는 음수, 두 문자열의 내용이 완전히 같은 경우 0을 반환

⭐️ Example

#include <stdio.h>
#include <string.h>

int main() {
    // 두 문자열 비교
    const char *str1 = "apple";
    const char *str2 = "apple pie";

    // strcmp 함수 사용
    int result1 = strcmp(str1, str2);
    printf("strcmp result: %d\n", result1);

    // strncmp 함수 사용 (전체 문자열 비교)
    int result2 = strncmp(str1, str2, strlen(str1));
    printf("strncmp result: %d\n", result2);

    return 0;
}
>> 
strcmp result: -4
strncmp result: 0

strstr()

char *strstr ( const char *str1, const char *str2 );
  • 문자열에서 부분 문자열을 검색하는 함수
  • 첫 번째 인수로 검색 대상이 되는 문자열, 두 번째 인수로 찾고자 하는 부분 문자열을 입력
  • 일치하는 문자열을 찾으면 해당 위치의 포인터(char* 타입)를 반환, 찾지 못하면 null pointer를 반환

⭐️ Example

#include <stdio.h>
#include <string.h>

int main() {
    const char *str1 = "Hello, World!";
    const char *str2 = "World";

    char *result = strstr(str1, str2);

    if (result != NULL) {
        printf("부분 문자열이 발견되었습니다: %s\n", result);
    } else {
        printf("부분 문자열을 찾을 수 없습니다.\n");
    }

    return 0;
}
>> 부분 문자열이 발견되었습니다: World!

strchr() & strrchr()

char *strchr ( const char *str, int character );
char *strrchr ( const char *str, int character );
  • 문자열에서 특정 문자를 검색하는 함수
  • 첫 번째 인수로 검색 대상이 되는 문자열, 두 번째 인수로 찾고자 하는 문자를 입력
  • strchr() 함수는 문자열에서 검색한 문자가 처음으로 등장하는 곳의 포인터를 반환
  • strrchr() 함수는 문자열에서 검색한 문자가 마지막으로 등장하는 곳의 포인터를 반환

⭐️ Example

#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Hello, World!";
    char search_char = 'W';

    char *result = strchr(str, search_char);

    if (result != NULL) {
        printf("문자가 발견되었습니다: %s\n", result);
    } else {
        printf("문자를 찾을 수 없습니다.\n");
    }

    return 0;
}
>> 문자가 발견되었습니다: World!

ctype.h

문자(character)와 관련된 함수들을 선언하는 헤더 파일 (Character Type Header)

toupper() & tolower()

int toupper ( int c );
int tolower ( int c );

인수로 전달된 문자열의 영문자를 모두 대문자나 소문자로 변환시켜주는 함수

⭐️ Example

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main() {
    char str[] = "Hello, World!";
    int length = strlen(str);

    // 문자열 전체를 대문자로 변환
    for (int i = 0; i < length; i++) {
        str[i] = toupper(str[i]);
    }

    printf("Uppercase String: %s\n", str);

    return 0;
}
>> Uppercase String: HELLO, WORLD!