본문 바로가기

Algorithms

C언어 - 문자열 탐색, 비교 구현해보기

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