사이먼's 코딩노트
[C언어] 포인터&배열 문제풀이(2) 본문
- 이번에는 포인터, 배열과 문자열의 심화된 문제를 풀어봅시다.
[문제 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 |