Commit dca3f6af by 정용석

Merge branch 'issue/MODEL-644' into 'master'

[MODEL-644] 엉금엉금 과제

See merge request !1
parents c24cc369 08b69bf0
#include <stdio.h>
#include <string.h>
int my_strlen(const char *str){
if(str == NULL){
return -1;
}
int count = 0;
while(str[count] != '\0'){
count++;
}
return count;
}
/**
* src에 저장된 문자열을 dest로 복사하는 함수
* @param dest의 길이가 src의 길이보다 길어야합니다.
* @return
*/
char *my_strcpy(char *dest, const char *src){
if(dest == NULL || src == NULL){
return NULL;
}
int i = 0;
while(src[i] != '\0'){
dest[i] = src[i];
i++;
}
dest[i] = '\0';
return dest;
}
int my_strcmp(const char *str1, const char *str2){
if(str1 == NULL || str2 == NULL){
return -100; // NULL 입력시 -100 반환
}
int i = 0;
while(str1[i] == str2[i] && str1[i] != '\0' && str2[i] != '\0'){
i++;
}
int str1Length = my_strlen(str1);
if(str1Length == my_strlen(str2) && str1Length == i){
return 0;
}else if(str1[i] > str2[i]){
return 1;
}else{
return -1;
}
}
char *my_strstr(char *haystack, const char *needle){
if(haystack == NULL || needle == NULL){
return NULL;
}
int i = 0;
int j = 0;
int h_length = my_strlen(haystack);
int n_length = my_strlen(needle);
while(h_length > i){
if(haystack[i + j] == needle[j]){
j++;
if(j >= n_length){
return &haystack[i];
}
}else{
i++;
j = 0;
}
}
return NULL;
}
char *my_strtok(char *str, const char *delim) {
static char *current_pos = NULL; // 현재 처리 위치
char *start; // 반환할 토큰 시작 위치
// 새로운 문자열이 입력된 경우
if (str != NULL) {
current_pos = str;
}
// 더 이상 처리할 문자열이 없는 경우
if (current_pos == NULL) {
return NULL;
}
// 토큰의 시작 위치 설정 (구분자가 아닌 첫 번째 문자)
start = current_pos;
// 구분자를 만나기 전까지 진행
while (*current_pos != '\0') {
for (int i = 0; delim[i] != '\0'; i++) {
if (*current_pos == delim[i]) {
*current_pos = '\0'; // 현재 구분자를 '\0'로 바꿔 토큰 종료
current_pos++; // 다음 위치로 이동
// 구분자 다음에 더 처리할 문자가 없으면 NULL 반환
if (*start == '\0') {
start = current_pos; // 다음 토큰으로 시작 위치 이동
continue;
}
return start;
}
}
current_pos++; // 구분자가 아니면 계속 진행
}
// 문자열 끝에 도달한 경우
if (*start == '\0') {
return NULL;
}
current_pos = NULL;
return start;
}
int main(void){
char str1[] = "Hello, World!안녕";
printf("%d %d\n", strlen(str1), my_strlen(str1));
char dest[5];
char str2[] = "Hi hi hi hi hi";
printf("%s\n%s\n", strcpy(dest, str2), my_strcpy(dest, str2));
char str5[] = "AAA";
char str6[] = "AAA";
char str7[] = "AAB";
printf("%s %s\n", str5, str6);
if(my_strcmp(str5, str6) == 0){
printf("두 문자열이 같습니다.\n");
}else if(my_strcmp(str5, str6) == -1){
printf("첫 번째 문자열이 작습니다.\n");
}else if(my_strcmp(str5, str6) == 1){
printf("첫 번째 문자열이 큽니다.\n");
}else{
printf("잘못된 함수 사용입니다.\n");
}
printf("%s %s\n", str6, str7);
if(my_strcmp(str6, str7) == 0){
printf("두 문자열이 같습니다.\n");
}else if(my_strcmp(str6, str7) == -1){
printf("첫 번째 문자열이 작습니다.\n");
}else if(my_strcmp(str6, str7) == 1){
printf("첫 번째 문자열이 큽니다.\n");
}else{
printf("잘못된 함수 사용입니다.\n");
}
printf("%s %s\n", str7, str6);
if(my_strcmp(str7, str6) == 0){
printf("두 문자열이 같습니다.\n");
}else if(my_strcmp(str7, str6) == -1){
printf("첫 번째 문자열이 작습니다.\n");
}else if(my_strcmp(str7, str6) == 1){
printf("첫 번째 문자열이 큽니다.\n");
}else{
printf("잘못된 함수 사용입니다.\n");
}
char str3[] = "Hello, WWorld! 안녕!";
char *result1 = strstr(str3, "World");
char *result2 = my_strstr(str3, "World");
if(result1){
printf("result1 : %s\n", result1);
}else{
printf("result1 not found.\n");
}
if(result2){
printf("result2 : %s\n", result2);
}else{
printf("result2 not found.\n");
}
char str4[] = "apple,banana;grape";
char *token = my_strtok(str4, ",;");
while (token != NULL) {
printf("Token: %s\n", token);
token = my_strtok(NULL, ",;");
}
return 0;
}
\ No newline at end of file
// base64 인코딩, 디코딩 함수
#include <iostream>
#include <vector>
#include <string>
using namespace std; // using namespace 문구를 사용하는 것은
// namespace 충돌 문제가 있어서 지양된다.
const string base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
string base64_encode(const string &str){
string result;
size_t str_len = str.size();
for(int i = 0; i < str_len; i += 3) {
unsigned char b1 = str[i];
unsigned char b2 = (i+1 < str_len) ? str[i+1] : 0;
unsigned char b3 = (i+2 < str_len) ? str[i+2] : 0;
result += base64_table[b1 >> 2];
result += base64_table[((b1 & 0b00000011) << 4) | (b2 >> 4)];
result += base64_table[((b2 & 0b00001111) << 2) | (b3 >> 6)];
result += base64_table[b3 & 0b00111111];
}
// 마지막 '=' 변경
if (str_len % 3 == 1) {
result[result.size() - 1] = '=';
result[result.size() - 2] = '=';
} else if (str_len % 3 == 2) {
result[result.size() - 1] = '=';
}
return result;
}
string base64_decode(const string &str){
string result;
size_t str_len = str.size();
vector<int> decode_table(256, -1); // 문자 -> 숫자 변환 테이블
if(str_len % 4 != 0){
throw invalid_argument("잘못된 길이가 입력됐습니다.");
}
for(int i = 0; i < base64_table.size(); i++){
decode_table[base64_table[i]] = i;
}
for(int i = 0; i < str_len; i += 4){
int b1 = decode_table[str[i]];
int b2 = decode_table[str[i+1]];
int b3 = (str[i+2] != '=') ? decode_table[str[i+2]] : 0;
int b4 = (str[i+3] != '=') ? decode_table[str[i+3]] : 0;
result += static_cast<unsigned char>((b1 << 2) | (b2 >> 4));
result += static_cast<unsigned char>(((b2 & 0b00001111) << 4) | (b3 >> 2));
result += static_cast<unsigned char>(((b3 & 0b00000011) << 6) | b4);
}
return result;
}
int main() {
string input = "안녕하세요 Hello";
string encoded = base64_encode(input);
string decoded = base64_decode(encoded);
cout << "input size : " << input.size() << endl;
cout << "Original : " << input << endl;
cout << "Base64 Encoded : " << encoded << endl;
cout << "Base64 Decoded : " << decoded << endl;
// 출력 결과
// input size : 21
// Original : 안녕하세요 Hello
// Base64 Encoded : 7JWI64WV7ZWY7IS47JqUIEhlbGxv
// Base64 Decoded : 안녕하세요 Hello
return 0;
}
\ No newline at end of file
#include <stdio.h>
#include <string.h>
int my_strlen(const char *str){
if(str == NULL){
return -1;
}
int count = 0;
while(str[count] != '\0'){
count++;
}
return count;
}
int utf8_strlen(const char *str){
if(str == NULL){
return -1;
}
int count = 0;
int index = 0;
while(str[index] != '\0'){
unsigned c = (unsigned char) str[index];
if(c <= 0x7F){
index += 1;
}else if(c >= 0xC2 && c <= 0xDF){
index += 2;
}else if(c >= 0xE0 && c <= 0xEF){
index += 3;
}else if(c >= 0xF0 && c <= 0xF7){
index += 4;
}else{
printf("UTF-8 형식이 아닙니다.");
return -1;
}
count++;
}
return count;
}
/**
* src에 저장된 문자열을 dest로 복사하는 함수
* @param dest의 길이가 src의 길이보다 길어야합니다.
* @return
*/
char *utf8_strcpy(char *dest, const char *src){
if(dest == NULL || src == NULL){
return NULL;
}
int i = 0;
while(src[i] != '\0'){
dest[i] = src[i];
i++;
}
dest[i] = '\0';
return dest;
}
int utf8_strcmp(const char *str1, const char *str2){
if(str1 == NULL || str2 == NULL){
return -100; // NULL 입력시 -100 반환
}
int i = 0;
while(str1[i] == str2[i] && str1[i] != '\0' && str2[i] != '\0'){
i++;
}
int str1Length = my_strlen(str1);
if(str1Length == my_strlen(str2) && str1Length == i){
return 0;
}else if(str1[i] > str2[i]){
return 1;
}else{
return -1;
}
}
char *utf8_strstr(char *haystack, const char *needle){
if(haystack == NULL || needle == NULL){
return NULL;
}
int i = 0;
int j = 0;
int h_length = my_strlen(haystack);
int n_length = my_strlen(needle);
while(h_length > i){
if(haystack[i + j] == needle[j]){
j++;
if(j >= n_length){
return &haystack[i];
}
}else{
i++;
j = 0;
}
}
return NULL;
}
char *utf8_strtok(char *str, const char *delim) {
static char *current_pos = NULL; // 현재 처리 위치
char *start; // 반환할 토큰 시작 위치
// 새로운 문자열이 입력된 경우
if (str != NULL) {
current_pos = str;
}
// 더 이상 처리할 문자열이 없는 경우
if (current_pos == NULL) {
return NULL;
}
// 토큰의 시작 위치 설정 (구분자가 아닌 첫 번째 문자)
start = current_pos;
// 구분자를 만나기 전까지 진행
while (*current_pos != '\0') {
for (int i = 0; delim[i] != '\0'; i++) {
if (*current_pos == delim[i]) {
*current_pos = '\0'; // 현재 구분자를 '\0'로 바꿔 토큰 종료
current_pos++; // 다음 위치로 이동
// 구분자 다음에 더 처리할 문자가 없으면 NULL 반환
if (*start == '\0') {
start = current_pos; // 다음 토큰으로 시작 위치 이동
continue;
}
return start;
}
}
current_pos++; // 구분자가 아니면 계속 진행
}
// 문자열 끝에 도달한 경우
if (*start == '\0') {
return NULL;
}
current_pos = NULL;
return start;
}
int main() {
char utf8_str[] = "안녕하세요, world!";
printf("%s\n", utf8_str);
printf("UTF-8 문자열 길이: %d\n", utf8_strlen(utf8_str));
char copy[50];
utf8_strcpy(copy, utf8_str);
printf("복사된 문자열: %s\n", copy);
const char *str1 = "안녕하세요";
const char *str2 = "안녕안녕요";
printf("%s\n%s\n", str1, str2);
printf("문자열 비교 결과: %d\n", utf8_strcmp(str1, str2));
char *found = utf8_strstr(utf8_str, "world");
if (found) {
printf("찾은 부분 문자열: %s\n", found);
}
char token_str[] = "안녕하세요, world! 이것은 테스트입니다.";
char *token = utf8_strtok(token_str, " ,!");
while (token) {
printf("토큰: %s\n", token);
token = utf8_strtok(NULL, " ,!");
}
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment