본문 바로가기
Computer Science/C 언어

[C #15] 문자열 (Strings)

by rnasterofmysea 2024. 12. 13.
728x90
반응형

문자열 (Strings)

  1. 문자열은 문자 배열이며 마지막에 **'\0'**으로 종료.
  2. C에서 문자열 처리는 **<string.h>

** 라이브러리의 다양한 함수를 통해 수행. 3. 문자열 처리 주요 함수:

  • strlen: 문자열 길이 반환.
  • strcpy, strncpy: 문자열 복사.
  • strcat, strncat: 문자열 연결.
  • strcmp, strncmp: 문자열 비교.
  • strchr, strstr: 특정 문자 또는 문자열 검색.
  1. 동적 메모리를 통해 문자열 크기를 유연하게 관리 가능.
strlen 문자열 길이 계산
strcpy 문자열 복사
strcat 문자열 연결
strcmp 문자열 비교
strchr 특정 문자 검색
strstr 특정 문자열 검색
strtok 문자열 분리
memset 메모리 초기화
memcpy 메모리 복사

 


13.1 문자열이란?

  • 문자열문자의 배열로, 마지막에 **널 문자 (\0)**로 종료됩니다.
  • 문자열의 크기는 실제 문자 수보다 1 더 큽니다. (\0 포함)

문자열 선언

char str[10] = "Hello";    // "Hello\0" 저장
char str[] = {'H', 'e', 'l', 'l', 'o', '\0'};  // 동일한 표현

13.2 문자열과 배열

문자열 출력

  • 문자열을 출력하려면 %s 포맷을 사용합니다.

예제: 문자열 출력

#include <stdio.h>

int main(void) {
    char str[] = "Hello, World!";
    printf("문자열: %s\n", str);
    return 0;
}

출력 결과:

문자열: Hello, World!

문자열 입력

  • 문자열 입력 시 scanf 또는 **fgets**를 사용합니다.

scanf 예제:

#include <stdio.h>

int main(void) {
    char str[50];
    printf("문자열 입력: ");
    scanf("%s", str);  // 공백 전까지만 입력받음
    printf("입력된 문자열: %s\n", str);
    return 0;
}

출력 결과:

문자열 입력: Hello World
입력된 문자열: Hello

fgets 예제:

#include <stdio.h>

int main(void) {
    char str[50];
    printf("문자열 입력: ");
    fgets(str, sizeof(str), stdin);  // 공백 포함 입력 가능
    printf("입력된 문자열: %s", str);
    return 0;
}

출력 결과:

문자열 입력: Hello World
입력된 문자열: Hello World

13.3 문자열과 포인터

포인터로 문자열 관리

  • 문자열은 문자 배열로 표현되지만, 포인터로도 관리 가능합니다.

예제: 문자열 포인터

#include <stdio.h>

int main(void) {
    char *str = "Hello, Pointer!";
    printf("문자열: %s\n", str);
    return 0;
}

출력 결과:

문자열: Hello, Pointer!

13.4 문자열 라이브러리 함수

C 표준 라이브러리 **<string.h>**는 문자열 처리를 위한 다양한 함수를 제공합니다.


1) 문자열 길이 (strlen)

  • 문자열의 길이를 반환 (\0 제외).

사용법:

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

int main(void) {
    char str[] = "Hello";
    printf("문자열 길이: %lu\n", strlen(str));  // 출력: 5
    return 0;
}

2) 문자열 복사 (strcpy와 strncpy)

  • strcpy: 문자열을 다른 문자열에 복사.
  • strncpy: 복사할 최대 길이 지정.

예제:

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

int main(void) {
    char src[] = "Source";
    char dest[20];

    strcpy(dest, src);  // src의 내용을 dest에 복사
    printf("복사된 문자열: %s\n", dest);

    return 0;
}

출력 결과:

복사된 문자열: Source

3) 문자열 연결 (strcat와 strncat)

  • strcat: 문자열을 다른 문자열에 연결.
  • strncat: 연결할 최대 길이 지정.

예제:

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

int main(void) {
    char str1[20] = "Hello, ";
    char str2[] = "World!";

    strcat(str1, str2);  // str2를 str1에 연결
    printf("연결된 문자열: %s\n", str1);

    return 0;
}

출력 결과:

연결된 문자열: Hello, World!

4) 문자열 비교 (strcmp와 strncmp)

  • strcmp:
    • 두 문자열을 비교.
    • 같으면 0, 앞 문자열이 작으면 음수, 크면 양수 반환.
  • strncmp: 비교할 최대 길이 지정.

예제:

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

int main(void) {
    char str1[] = "Hello";
    char str2[] = "World";

    if (strcmp(str1, str2) == 0) {
        printf("문자열이 같습니다.\n");
    } else {
        printf("문자열이 다릅니다.\n");
    }

    return 0;
}

출력 결과:

문자열이 다릅니다.

5) 문자열 검색 (strchr와 strstr)

  • strchr: 문자열에서 특정 문자를 찾음.
  • strstr: 문자열에서 특정 문자열을 찾음.

strchr 예제:

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

int main(void) {
    char str[] = "Hello, World!";
    char *pos = strchr(str, 'W');  // 'W' 찾기

    if (pos != NULL) {
        printf("문자 'W' 위치: %ld\n", pos - str);
    } else {
        printf("문자를 찾을 수 없습니다.\n");
    }

    return 0;
}

출력 결과:

문자 'W' 위치: 7

strstr 예제:

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

int main(void) {
    char str[] = "Hello, World!";
    char *pos = strstr(str, "World");  // "World" 찾기

    if (pos != NULL) {
        printf("문자열 'World' 위치: %ld\n", pos - str);
    } else {
        printf("문자열을 찾을 수 없습니다.\n");
    }

    return 0;
}

출력 결과:

문자열 'World' 위치: 7

13.5 문자열과 동적 메모리

동적 메모리를 이용한 문자열 처리

  • 동적으로 문자열의 크기를 지정.

예제:

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

int main(void) {
    char *str;
    char input[] = "Dynamic Memory";

    str = (char *)malloc(strlen(input) + 1);  // 문자열 크기만큼 메모리 할당

    if (str == NULL) {
        printf("메모리 할당 실패\n");
        return 1;
    }

    strcpy(str, input);  // 문자열 복사
    printf("동적 메모리에 저장된 문자열: %s\n", str);

    free(str);  // 메모리 해제
    return 0;
}

출력 결과:

동적 메모리에 저장된 문자열: Dynamic Memory

13.6 심화 예제

1. 문자열 뒤집기

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

void reverseString(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }
}

int main(void) {
    char str[] = "Hello, World!";
    reverseString(str);
    printf("뒤집힌 문자열: %s\n", str);
    return 0;
}

출력 결과:

뒤집힌 문자열: !dlroW ,olleH

2. 문자열 내 단어 개수 세기

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

int countWords(const char *str) {
    int count = 0;
    const char *ptr = str;

    while (*ptr) {
        if (*ptr == ' ' || *ptr == '\n' || *ptr == '\t') {
            count++;
        }
        ptr++;
    }
    return count + 1;  // 마지막 단어 포함
}

int main(void) {
    char str[] = "Count the number of words";
    printf("단어 개수: %d\n", countWords(str));
    return 0;
}

출력 결과:

단어 개수: 5

 

728x90
반응형