Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Q
Quiz-2
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
정용석
Quiz-2
Commits
675e9c1b
Commit
675e9c1b
authored
Jan 21, 2025
by
정용석
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MODEL-644
엉금엉금 과제 풀이
parent
c24cc369
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
415 additions
and
0 deletions
+415
-0
Cstandard.c
+182
-0
base64.cpp
+65
-0
utf8.c
+168
-0
No files found.
Cstandard.c
0 → 100644
View file @
675e9c1b
#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
;
}
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
-
1
;
}
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
{
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
{
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
{
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.cpp
0 → 100644
View file @
675e9c1b
// base64 인코딩, 디코딩 함수
#include <iostream>
#include <vector>
#include <string>
using
namespace
std
;
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
&
0
b00000011
)
<<
4
)
|
(
b2
>>
4
)];
result
+=
base64_table
[((
b2
&
0
b00001111
)
<<
2
)
|
(
b3
>>
6
)];
result
+=
base64_table
[
b3
&
0
b00111111
];
}
// 마지막 '=' 변경
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
&
0
b00001111
)
<<
4
)
|
(
b3
>>
2
));
result
+=
static_cast
<
unsigned
char
>
(((
b3
&
0
b00000011
)
<<
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
;
return
0
;
}
\ No newline at end of file
utf8.c
0 → 100644
View file @
675e9c1b
#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
;
}
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
-
1
;
}
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
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment