사이먼's 코딩노트

[C언어] 포인터&배열 문제풀이(2) 본문

C언어

[C언어] 포인터&배열 문제풀이(2)

simonpark817 2024. 2. 19. 20:25
  • 이번에는 포인터, 배열과 문자열의 심화된 문제를 풀어봅시다.

 

[문제 1]

  • 다음은 문자열이 특정 문자열로 시작하는 지 검사하는 함수를 구현해보세요.
#include <stdio.h>

typedef int bool;

#define true 1
#define false 0

int get_str_len(char* str) {
    for ( int i = 0; true; i++ ) {
        if ( str[i] == '\0' ) {
            return i;
        }
    }
}

bool starts_with(char* str, char* start) {
    int str_len = get_str_len(str);
    int start_len = get_str_len(start);

    if(start_len > str_len) {
        return false;
    }

    for(int i = 0; i < start_len; i++) {
        if(str[i] != start[i]) {
            return false;
        }
    }

    return true;
}

int main(void) {

    bool rs;

    rs = starts_with("abc", "ab");
    printf("rs : %d\n", rs); // 출력 rs : 1

    rs = starts_with("kbs", "kb");
    printf("rs : %d\n", rs); // 출력 rs : 1

    rs = starts_with("mbc", "mc");
    printf("rs : %d\n", rs); // 출력 rs : 0

    return 0;
}
  • main 함수를 살펴보면 starts_with() 함수를 이용하여 전체 문자열이 특정 문자열로 시작하는 지 참과 거짓을 통해 출력하게 되어있다.
  • 예를 들어 starts_with("abc", "ab") 이면 "abc"이 "ab"로 시작되기 때문에 참을 나타내는 1이 출력된다.
  • C언어에서는 참, 거짓을 true와 false로 나타내지 않기 때문에 #define과 typedef를 통해 bool 이라는 타입도 지정해준다.
  • 먼저 전체 문자열과 특정 문자열의 길이를 구하기 위해서 get_str_len() 함수를 구현해준다.
  • starts_with() 함수는 매개변수로 전체 문자열의 주소인 char *str과 특정 문자열의 주소인 char* start를 받는다.
  • 함수에서 참과 거짓을 반환해야 되기 때문에 void가 아닌 bool을 사용하고 return 값을 정해줘야한다.
  • 함수의 로직은 다음과 같다. 먼저 전체 문자열과 특정 문자열의 길이를 구하고 만약 특정 문자열이 전체 문자열보다 길 경우는 false를 return한다.
  • 그 다음은 반복문을 통해 배열의 0번째 자리부터 특정 문자열의 길이만큼 반복하면서 만약 각 배열의 위치의 문자가 서로 일치하지 않으면 false를 return한다. 이를 모두 통과한 경우에는 true를 return한다.

 

[문제 2]

  • 다음은 문자열이 특정 문자열로 끝나는 지 검사하는 함수를 구현해보세요.
#include <stdio.h>

typedef int bool;

#define true 1
#define false 0

int get_str_len(char* str) {
    for ( int i = 0; true; i++ ) {
        if ( str[i] == '\0' ) {
            return i;
        }
    }
}

bool ends_with(char* str, char* str2) {
    int str_len = get_str_len(str);
    int str2_len = get_str_len(str2);

    if ( str_len < str2_len ) {
        return false;
    }

    int start_index = str_len - str2_len;

    for ( int i = 0; i < str2_len; i++ ) {
        if ( str[start_index + i] != str2[i] ) {
            return false;
        }
    }

    return true;
}

int main(void) {

    bool rs;

    rs = ends_with("abc", "bc");
    printf("rs : %d\n", rs); // 출력 rs : 1

    rs = ends_with("kbs", "kb");
    printf("rs : %d\n", rs); // 출력 rs : 0

    rs = ends_with("kbs", "bs");
    printf("rs : %d\n", rs); // 출력 rs : 1

    rs = ends_with("mbc", "mc");
    printf("rs : %d\n", rs); // 출력 rs : 0

    return 0;
}
  • main 함수를 살펴보면 ends_with() 함수를 이용하여 전체 문자열이 특정 문자열로 끝나는 지 참과 거짓을 통해 출력하게 되어있다.
  • 예를 들어 ends_with("abc", "bc") 이면 "abc"이 "bc"로 끝나기 때문에 참을 나타내는 1이 출력된다.
  • C언어에서는 참, 거짓을 true와 false로 나타내지 않기 때문에 #define과 typedef를 통해 bool 이라는 타입도 지정해준다.
  • 먼저 전체 문자열과 특정 문자열의 길이를 구하기 위해서 get_str_len() 함수를 구현해준다.
  • ends_with() 함수는 매개변수로 전체 문자열의 주소인 char* str과 특정 문자열의 주소인 char* str2를 받는다.
  • 함수에서 참과 거짓을 반환해야 되기 때문에 void가 아닌 bool을 사용하고 return 값을 정해줘야한다.
  • 함수의 로직은 다음과 같다. 먼저 전체 문자열과 특정 문자열의 길이를 구하고 만약 특정 문자열이 전체 문자열보다 길 경우는 false를 return한다.
  • 그 다음은 끝에 있는 문자열을 비교해야되기 때문에 시작하는 index 지점을 따로 변수로 지정해줘야된다.
  • start_index라는 변수를 생성해주고 해당 변수는 전체 문자열의 길이에서 특정 문자열의 길이를 빼준다.
  • 그리고 반복문을 통해 배열의 start_index번째 자리부터 특정 문자열의 길이만큼 반복하면서 만약 각 배열의 위치의 문자가 서로 일치하지 않으면 false를 return한다. 이를 모두 통과한 경우에는 true를 return한다.

 

[문제 3]

  • 다음은 두 문자열이 같은 지 검사하는 함수를 구현해보세요.
#include <stdio.h>
#define true 1
#define false 0

typedef int bool;

bool get_str_len(char* str) {
    for ( int i = 0; true; i++ ) {
        if ( str[i] == '\0' ) {
            return i;
        }
    }
}

bool str_equals(char* str1, char* str2) {
    if(str1 == str2) {
        return true;
    }

    int len_of_str1 = get_str_len(str1);
    int len_of_str2 = get_str_len(str2);

    if(len_of_str1 != len_of_str2) {
        return false;
    }

    for(int i = 0; i < len_of_str1; i++) {
        if(str1[i] != str2[i]) {
            return false;
        }
    }

    return true;
}

int main(void) {
    char* str1 = "abc";
    char* str2 = "abc";
    char* str3 = "abcd";
    char* str4 = "bbc";
    char str5[] = "abc";

    printf("`%s` is equals to `%s` : %d\n", str1, str1, str_equals(str1, str1));
    // 출력 => `abc` is equals to `abc` : 1

    printf("`%s` is equals to `%s` : %d\n", str1, str2, str_equals(str1, str2));
    // 출력 => `abc` is equals to `abc` : 1

    printf("`%s` is equals to `%s` : %d\n", str1, str3, str_equals(str1, str3));
    // 출력 => `abc` is equals to `abcd` : 0

    printf("`%s` is equals to `%s` : %d\n", str1, str4, str_equals(str1, str4));
    // 출력 => `abc` is equals to `bbc` : 0

    printf("`%s` is equals to `%s` : %d\n", str1, str5, str_equals(str1, str5));
    // 출력 => `abc` is equals to `abc` : 1

    return 0;
}
  • main 함수를 살펴보면 str_equals() 함수를 이용하여 두 문자열이 서로 같은 지 참과 거짓을 통해 출력하게 되어있다.
  • 예를 들어 str_equals(str1, str2) 이면 str1의 문자열과 str2의 문자열이 "abc"로 일치하기 때문에 참을 나타내는 1이 출력된다.
  • C언어에서는 참, 거짓을 true와 false로 나타내지 않기 때문에 #define과 typedef를 통해 bool 이라는 타입도 지정해준다.
  • 먼저 두 문자열의 길이를 구하기 위해 get_str_len() 함수를 구현해준다.
  • str_equal() 함수는 매개변수로 각 문자열의 주소인 char* str1과 char* str를 받는다.
  • 함수에서 참과 거짓을 반환해야 되기 때문에 void가 아닌 bool을 사용하고 return 값을 정해줘야한다.
  • 함수의 로직은 다음과 같다. 먼저 가장 단순하게 str1과 str2를 직접 비교하고 같으면 true를 return한다.
  • 그 다음으로는 각 문자열의 길이를 받아오고 두 문자열의 길이가 같지 않으면 false를 return한다. 추가로 반복문을 통해 배열의 0번째 위치부터 문자열의 길이까지 반복하면서 각 배열의 위치의 문자를 하나씩 확인해보고 일치하지 않으면 역시 false를 return한다.

 

[문제 4]

  • 다음은 두 문자열이 같은 지 검사하고, 특정부분만 비교하는 함수를 구현해보세요.
#include <stdio.h>

#define false 0
#define true 1

typedef int bool;

bool str_part_equals(char* str1, int start, int end, char* str2) {
    int j = 0;
    for(int i = start; i < end; i++) {
        if(str1[i] != str2[j]) {
            return false;
        }
        j++;
    }

    return true;
}

int main(void) {
    printf("str_part_equals(\"abcd\", 0, 2, \"ab\") : %d\n", str_part_equals("abcd", 0, 2, "ab"));
    // 출력 => str_equals("abcd", 0, 2, "ab") : 1

    printf("str_part_equals(\"abcd\", 1, 2, \"b\") : %d\n", str_part_equals("abcd", 1, 2, "b"));
    // 출력 => str_equals("abcd", 1, 2, "b") : 1

    printf("str_part_equals(\"abcd\", 2, 2, \"\") : %d\n", str_part_equals("abcd", 2, 2, ""));
    // 출력 => str_equals("abcd", 2, 2, "") : 1

    printf("str_part_equals(\"abcd\", 2, 4, \"cb\") : %d\n", str_part_equals("abcd", 2, 4, "cb"));
    // 출력 => str_equals("abcd", 2, 4, "cb") : 0

    printf("str_part_equals(\"abcd\", 2, 4, \"cd\") : %d\n", str_part_equals("abcd", 2, 4, "cd"));
    // 출력 => str_equals("abcd", 2, 4, "cb") : 1

    return 0;
}
  • main 함수를 살펴보면 str_part_equals() 함수를 이용하여 전체 문자열과 특정 문자열의 시작과 끝 index를 통해 특정부분만 비교하여 서로 같은 지 참과 거짓을 통해 출력하게 되어있다.
  • 예를 들어 str_part_equals("abcd", 0, 2, "ab") 이면 "abcd"의 배열 0번째 부터 2번째 사이의 문자열이 "ab"로 일치하기 때문에 참을 나타내는 1이 출력된다.
  • C언어에서는 참, 거짓을 true와 false로 나타내지 않기 때문에 #define과 typedef를 통해 bool 이라는 타입도 지정해준다.
  • str_part_equals() 함수는 매개변수로 전체 문자열의 주소인 char* str1과 시작 index인 start와 끝 index인 end, 특정 문자열의 주소인 char* str2를 받는다.
  • 함수에서 참과 거짓을 반환해야 되기 때문에 void가 아닌 bool을 사용하고 return 값을 정해줘야한다.
  • 함수의 로직은 다음과 같다. 반복문을 통해 전체 문자열 배열의 start번째 부터 end번째까지 문자를 확인하고 특정 문자열은 j라는 변수를 하나 생성하여 특정 문자열의 시작점을 0번째 부터 맞춰 두 문자열을 비교하고 문자열이 일치하지 않으면 false를 return하고 이를 모두 통과한 경우에는 true를 return한다.

 

[문제 5]

  • 다음은 한 문자열이 다른 문자열 안에서 어디에 위치하는 지 검사하는 함수를 구현해보세요.
#include <stdio.h>
#define true 1
#define false 0
typedef int bool;

int get_str_len(char* str) {
    for ( int i = 0; true; i++ ) {
        if ( str[i] == '\0' ) {
            return i;
        }
    }
}

bool str_part_equals(char* str1, int start, int end, char* str2) {
    int j = 0;
    for ( int i = start; i < end; i++ ) {
        if ( str1[i] != str2[j] ) {
            return false;
        }

        j++;
    }

    return true;
}

int get_index_of_str(char* str1, char* str2) {
    int str1_len = get_str_len(str1);
    int str2_len = get_str_len(str2);

    if ( str2_len > str1_len ) {
        return -1;
    }

    if ( str2_len == 0 ) {
        return -1;
    }

    int compare_count = str1_len - str2_len + 1;

    for ( int i = 0; i < compare_count; i++ ) {
        if ( str_part_equals(str1, i, i + str2_len, str2) ) {
            return i;
        }
    }

    return -1;
}

int main(void) {
    int index;

    index = get_index_of_str("abc", "b");
    printf("index : %d\n", index);
    // 출력 => index : 1

    index = get_index_of_str("test", "es");
    printf("index : %d\n", index);
    // 출력 => index : 1

    index = get_index_of_str("abcd", "bd");
    printf("index : %d\n", index);
    // 출력 => index : -1

    index = get_index_of_str("abcdbcf", "bcf");
    printf("index : %d\n", index);
    // 출력 => index : -4

    return 0;
}
  • main 함수를 살펴보면 get_index_of_str() 함수를 이용하여 한 문자열이 다른 문자열 안에서 어디에 위치하는 지 index값을 출력하게 되어있다.
  • 예를 들어 get_index_of_str("abcdbcf", "bcf") 이면 "abcdbcf"에서 "bcf"가 4번째 index에서부터 시작되기 때문에 4가 출력된다.
  • get_index_of_str() 함수를 구현하기 전에 각 문자열의 길이를 구하는 get_str_len() 함수를 구현하고, 두 문자열이 같은 지 검하고 특정부분만 비교하는 str_part_equals() 함수를 구현한다.
  • get_index_of_str() 함수는 매개변수로 두 문자열의 주소인 char* str1과 char* str2를 받는다.
  • 만약 두 문자열이 서로 관련이 없다면 해당 index는 -1fh cnffurgodigksek.
  • 함수에서 index 정수 값을 반환해야 하기 때문에 void가 아닌 int를 사용하고 return 값은 -1로 지정한다.
  • 함수의 로직은 다음과 같다. 먼저 비교대상인 str2의 길이가 0인 널문자라면 위치할 것도 없이 false를 return하고 비교대상인 str2의 길이가 str1보다 길다면 이것도 false를 return한다.
  • 이 다음은 몇번의 검사가 필요한지 compare_count라는 변수를 생성해줘야한다.
  • compare_count은 예를 들어 "abc"에서 "b"의 index를 찾기 위해선 "abc"의 문자열을 문자 하나씩 검사해야 되기 때문에 "abc"의 길이에 맞게 총 3번의 비교 검사가 필요하다는 변수이다.
  • 그렇기 때문에 compare_count는 str1의 길이에서 비교대상인 str2의 길이를 빼고 +1을 해줘야한다.
  • 마지막으로 반복문을 통해 배열의 0번째부터 compare_count까지 반복하면서 두 문자열이 같은 지 검사하는 str_part_equals() 함수를 실행한다.
반응형

'C언어' 카테고리의 다른 글

[C언어] 정적 및 동적 할당  (0) 2024.02.21
[C언어] 구조체(Struct)  (0) 2024.02.20
[C언어] 포인터&배열 문제풀이(1)  (0) 2024.02.19
[C언어] 공공재 / strcpy  (0) 2024.02.19
[C언어] define / typedef / 문자 배열  (2) 2024.02.19