728x90
이번 포스팅은 C++를 사용하지 않고 (라이브러리 없이) C언어를 이용하여 직접 문자열 관련 함수들을 구현해 보았습니다.
strlen: 문자열 길이
C++의 <string.h>
- str.size() 혹은 str.length()
C언어
첫 번째 방법 (포인터)
int strlen(const char* str) {
int len = 0;
while (*str != '\0') {
++len;
++str;
}
return len;
}
int main() {
printf("%d\n", strlen("Hello")); // 5
}
두 번째 방법 (배열)
int strlen(const char* str) {
int len = 0;
while (str[len] != '\0') {
++len;
}
return len;
}
strcpy: 문자열 복사
C++의 <string.h>
- str1.copy(..) 사용: size_t copy(char* arr, size_t len, size_t index = 0)
- str1.copy(str2, 3, 5); //str1의 5번째 index부터 3의 길이만큼 복사해서 str2에 넣어줍니다. 여기서 반환값은 실제로 복사된 길이, 즉 3을 반환합니다.
- 마지막 str2[str1.copy(str2, 3, 5)] = ‘\0’; delimiter 넣어주어야 문자의 끝임을 나타낼 수 있음을 주의해야 합니다.
C 언어
char* strCpy(char* dest, const char* src) {
char* org = dest;
while (*src != '\0') {
*dest = *src;
++dest;
++src;
}
*dest = '\0'; // 문자열 마지막에 delimiter 추가!!
return org; // return dest; 는 틀림
// dest는 '\0'을 가리키므로
}
int main() {
char str[10];
printf("%s", strCpy(str, "Hello")); // Hello 출력
}
strcat - 문자열 연결
C++의 <string.h>
- str1.push_back(c): void push_back(char c)
- 문자 c를 연결해주는 메서드
- str1.pop_back(c): void pop_back()
- 맨 뒤의 문자 하나를 없애는 함수
- str1.replace(…): string& replace(size_t index, size_t len, const string& str)
- str1.replace(5,2, str2);
- str1의 5번째 인자에서부터 2개를 str2로 대체
- str1.replace(str1.size(), str2.size(), str2) 로 하면 str1 뒤에 str2 붙일 수 있습니다.
- operator +
- string끼리 더하여 이어 붙일 수 있습니다.
- str1+=str2;
C 언어
char* strCat(char* dest, const char* src) {
char* org = dest;
while (*dest != '\0') ++dest;
while (*src != '\0') {
*dest = *src;
++dest;
++src;
}
*dest = '\0'; // 문자열 마지막에 delimiter 추가!!
return org; // return dest; 는 틀림
}
int main() {
char str[20] = "Betty ";
printf("%s", strCat(str, "Hello")); // Betty Hello
}
위 코드에서 strCpy 메서드와 겹치는 부분이 있습니다. 이를 아래와 같이 strcpy 함수로 추출하여 구현할 수도 있습니다.
char* strCpy(char* dest, const char* src) {
char* org = dest;
while (*src != '\0') {
*dest = *src;
++dest;
++src;
}
*dest = '\0'; // 문자열 마지막에 delimiter 추가!!
return org; // return dest; 는 틀림
// dest는 '\0'을 가리키므로
}
char* strCat(char* dest, const char* src) {
char* org = dest;
while (*dest != '\0') ++dest;
dest = strCpy(dest, src);
return org; // return dest; 는 틀림
}
strcmp - 문자열 비교
C++의 <string.h>
- str1.compare(…): int compare(const string& str2)
- str1.compare(str2): 두 string이 같으면 0, str1이 사전 순으로 앞서면 음수, 반대면 양수 반환
C 언어
int strCmp(const char* str1, const char* str2) {
int idx = 0;
while (str1[idx] && str1[idx] == str2[idx]) idx++;
return str1[idx] - str2[idx]; // 핵심!
}
strreverse - 문자열 뒤집기
C++의 <algorithm>
- void reverse (BidirectionalIterator first, BidirectionalIterator last)
- reverse(str1.begin(), str1.end())
- vector(벡터), list(리스트), array(배열)도 가능
- [first, last) : first를 포함한 인덱스부터 last 바로 전 인덱스까지의 요소들을 거꾸로 뒤집음
C 언어
char* strReverse(char* str) {
int len = 0;
for (; str[len]; len++);
int half = len >> 1; // len/2
for (int i = 0; i < half; i++) {
char ch = str[i];
str[i] = str[len - 1 - i];
str[len - 1 - i] = ch;
}
return str;
}
atoi - String을 정수로 변환
C언어
int strToInt(const char* str) {
int val = 0;
int isNegative = 0;
// str이 음수일 경우
if (*str == '-') {
isNegative = 1;
str++;
}
while (*str != '\0') {
char ch = *str++;
if (ch < '0' || '9' < ch) break; // 문자열 cutting
// 예를 들어, 문자열 -1234abvdjhk 있을 때 4까지만 계산하도록
val = val * 10 + (ch - '0');
}
if (isNegative == 1) val *= -1;
return val;
}
itoa - 정수를 String으로 변환
C언어
char* intToStr(int num, char* buf) { // 버퍼 만들기
int idx = 0;
int isNegative = 0;
if (num < 0) {
isNegative = 1;
num *= -1;
}
while (num > 0) {
buf[idx++] = num % 10 + '0';
num /= 10;
}
if (isNegative) {
buf[idx++] = '-';
}
buf[idx] = '\0'; //delimiter 추가
// reverse 해야 한다.
int half = idx >> 1;
for (int i = 0; i < half; ++i) {
char ch = buf[i];
buf[i] = buf[idx - 1 - i];
buf[idx - 1 - i] = ch;
}
return buf;
}
<stdlib.h> 헤더에서 atoi 함수 사용 가능. (atoi, atof, atol)
[백준 문제]
728x90
반응형
'Algorithms' 카테고리의 다른 글
해시 함수 (Hash Table) (0) | 2023.12.13 |
---|---|
C언어 - Quick sort 구현 (0) | 2023.12.10 |
비트 연산 활용 (4) | 2023.12.03 |
그리디 알고리즘 (Greedy)과 다이나믹 프로그래밍 (DP) (0) | 2023.10.18 |
Euler's Phi (오일러 파이 함수) (2) | 2023.09.09 |