C언어

05. C언어_문자열(String) 관련 function

만수르코딩방 2024. 5. 15. 16:41

1. 개요

문자열은 문자형 자료의 집합으로 char형의 1차원 배열로 표현됩니다. 문자열 상수는 가변길이 상수이므로 반드시 데이터의 끝위치를 나타내기 위해 '\0'문자로 종료되며, 이중인용부호("")로 묶는다. 예를 들어 "hello"는 'h', 'e', 'l', 'l' 'o' '\0'의 집합이며,  char str[6] = "hello"로 나타낼 수 있다. 문자열 배열을 선언할 때 크기를 정하지 않으면 문자열의 크기만큼 메모리가 할당된다. 만약 실제 문자열의 크기보다 배열을 더 큰 사이즈로 선언한다면, 문자가 들어가고 남는 나머지 공간은 NULL로 채워진다. 문자열 변수는 다른 변수형의 배열과는 달리 문자열 자체가 하나의 의미를 가진다. 하지만 문자열도 결국 char들의 배열로 사용되기 때문에 배열 전체를 하나의 변수처럼 자유롭게 쓰는 것에는 제약이 있다. 예를 들어 문자열의 이름은 배열의 시작 주소를 나타내기 때문에 int형 변수에서 사용하는 대입연산자 조차 문자열에서는 사용하는 것이 어렵다. 따라서 C언어에서는 문자열 비교, 검색 등의 처리를 쉽게 할 수  있도록 도와주는 문자열 관련 함수를 지원해준다. 

2.0 문자열 길이,크기 확인 (strlen)

size_t strlen(const char *s)

: 문자열의 선두에서부터 NULL문자 사이의 문자 개수를 구한다. NULL문자는 길이에 포함되지 않는다.

#include <stdio.h>
#include <string.h>
void main(){
    char *str1 = "Korea";
    char *str2 = "com.com";
    char *str3 = "c language";
    printf("%d\n", strlen(str1));
    printf("%d\n", strlen(str2));
    printf("%d\n", strlen(str3));
}

 

 

2.1 문자열 비교 (strcmp, stricmp, strncmp,strnicmp)

- int strcmp(const char* s1, const char* s2) : 대소문자 구분하여 비교

- int stricmp(const char* s1, const char* s2) : 대소문자 구분하지 않고 비교

- int strncmp(const char* s1, const char* s2, size_t maxlen) : 대소 비교할 개수를 지정하여 비교

- int strnicmp(const char* s1, const char* s2, size_t maxlen) : 대소 비교할 개수를 지정하여 대소문자 구분없이 비교

 

s1<s2 인 경우 음수를 리턴

s1 = s2 인 경우 0을 리턴

s1>s2 인 경우 양수를 리턴

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

int main() {
    char *str1 = "banana";
    char *str2 = "BANANA";
    char *str3 = "banamo";
    char *str4 = "Banamo";

    int result1 = stricmp(str1, str2);
    if (result1 != 0) {//result1 = 0
        printf("str1 and str2 are not same by strcmp\n");
    }
    else { //str1<str2 인 경우 음수를 리턴,str1>str2 인 경우 양수를 리턴
        printf("str1 and str2 are same by strcmp\n");
    }
    //int result1 = strcmp(str1, str2) != 0; 
    int result2 = strncmp(str1, str3, 4);
    if (result2 != 0) { //result2 = 0
        printf("str1 and str3 are not same by strncmp\n");
    }
    else { //str1<str2 인 경우 음수를 리턴
        printf("str1 and str3 are same by strncmp\n");
    }
    //int result2 = strnicmp(str1, str4, 4) = 0;
}

 

 

2.2 문자열 이어붙이기 (strcpy, strncpy, strcat, strncat)

- char* strcpy(char* dest, const char* src) : 문자열 src를 문자배열 dest로 복사한다. NULL문자까지도 복사가 된다.

- char* strcat(char* dest, const char* src) : 문자열 끼리 연결, dest뒤에 src가 덧붙여지며 dest 뒤의 NULL 문자는 없어지고 src의 src의 NULL 문자는 남는다. dest는 자신이 가지고 있는 문자열 외에도 src의 문자열 길이만큼을 더할 수 있는 충분한 크기여야 한다. 

- dest의 번지수가 리턴된다

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

void main(){
    char src[20];
    char dest[20];
    strcpy(src, "BABO"); //'B''A''B''O''\0'
    strcpy(dest, "SUMIN"); //'S''U''M''I''N''\0'
    strcat(dest, src); //'S''U''M''I''N''B''A''B''O''\0'
    printf("%s\n", dest);
    int s1 = strlen(src); //4
    int s2 = strlen(dest); //9
    printf("%d%d\n", s1,s2);
}

 

 

2.3 문자열 검색(strchr, strstr)

- char* strchr(const*s, char c) : 문자 배열 s내에 문자 c가 있는지 검사하고, 있을 경우 문자 c가 있는 번지를 리턴

- char* strrchr(const*s, char c) : 문자 배열 s내에 문자 c가 있는지, 뒤에서 부터 문자를 찾는다.

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

int main() {
    char str[][10] = {"kiwi", "banana", "pear", "apple", "Razana", "KIWI"};
    int n = sizeof(str)/sizeof(str[0]);
    int count = 0;
    printf("행의 수 : %d\n", n);
    for (int i = 0; i<n; i++){
        for(int j = 0; j<sizeof(str[0]); j++){
            str[i][j] = tolower(str[i][j]);
        }
        printf("%s\n", str[i]);
    }
    for (int i = 0; i<n; i++){
        if (strcmp(str[i], "kiwi") == 0){
            printf("%d 번째 행에 위치(1)\n", i);
        }
        if (strstr(str[i], "ban") != NULL){
            printf("%d 번째 행에 위치(2)\n", i);
        }
        char* ptr = strchr(str[i], 'p');
        while (ptr != NULL ){
            printf("%d 번쨰 행에 위치(3)\n", i);
            ptr = (strchr(ptr+1, 'p'));
            count++;
            printf("%d 번쨰 행에 %d개 위치\n", i, count);
        }
    }
}