C언어 입문기 때 문자열을 처리하는 방법에 대해서 공부를 많이 하게 됩니다. 한글자, 한단어, 한문장 순으로 여러가지 형태로 문자를 처리하게 되는데 그 중 한번쯤은 풀어 봤을법한 주제 들 중 선택한 것이 문자열 카운트 세기 입니다. 과거 이 내용을 실험했던 자료를 찾았는데 그 내용을 post로 작성해 보았습니다.
문자열 카운트를 세기 전 문자를 카운터 세기를 해보겠습니다.
문자열 관련 헤더파일은 string.h 파일입니다. 아래와 같이 선언을 해줘야 문자열 함수들을 사용 할 수 있습니다.
#include
[문자 카운트 세기]
int char_cnt(char *ptr, char ch){
int i = 0;
while(*ptr){
if(*ptr++ == ch) i++;
}
return(i);
}
포인트 변수를 사용하여 카운트를 셀 문자열에서 각 문자들을 카운트를 세기 위한 문자(ch)과 비교하여 카운트를 세기를 수행하는 로직입니다. 최종적으로 리턴 i값으로 문자열 속의 해당 문자가 얼마나 들어 있는지 i(카운트) 값으로 알 수 있게 됩니다.
정상 작동하는지 살펴볼까요.
[실험]
#include
#include
int char_cnt(char *ptr, char ch){
int i = 0;
while(*ptr){
if(*ptr++ == ch) i++;
}
return(i);
}
int main(void) {
int cnt=0;
cnt = char_cnt("hello World",'o');
printf("%d \n",cnt);
return 0;
}
"hello World"라는 문자열에서 'o'라는 글자가 몇개 들어 있는지 카운트를 해볼까요.
눈을 보면 딱 2개가 보이네요. 정상적으로 카운트 한 결과가 2인지 보도록 하겠습니다.
[결과]
이제는 특정 문자열이 해당 문자여에서 몇번 들어있는지 확인해 보겠습니다.
[문자열 카운트 세기]
int str_cnt(char ptr1[], char ptr2[])
{
int i, j, k;
int count = 0;
for(i=0; ptr1[i] != NULL; i++)
for(j=i, k=0; ptr2[k] == ptr1[j]; k++, j++)
if(ptr2[k+1] == NULL){
count++;
break;
}
return ((count == 0) ? -1 : count);
}
앞에서 특정 문자를 비교하여 카운트 했다면 이번에는 문자열을 비교하여 카운트를 해보도록 하겠습니다. 앞에서 코딩한 내용을 변경하여 문자열 비교로 바꿔 볼까요.
기존에는 한글자 비교였지만 여기에서는 for문을 이용하여 여러 글자를 비교하는 카운트를 셀 수 있습니다. for문은 첫글자가 일치하면 그 다음 글자가 일치하는지 즉 null문자가 나올때까지 비교하여 카운트를 세게 ㅗ딥니다.
그럼 위 코딩이 정상적으로 출력 되는지 살펴보도록 하겠습니다.
[실험]
#include
#include
int str_cnt(char ptr1[], char ptr2[])
{
int i, j, k;
int count = 0;
for(i=0; ptr1[i] != NULL; i++)
for(j=i, k=0; ptr2[k] == ptr1[j]; k++, j++)
if(ptr2[k+1] == NULL){
count++;
break;
}
return ((count == 0) ? -1 : count);
}
int main(void) {
// your code goes here
int cnt=0;
cnt = str_cnt("hello hello World","hello");
printf("문자열 카운트 : %d \n",cnt);
return 0;
}
[결과]
문자와 문자열을 비교 체크하여 카운트를 세는 실험을 해보았습니다. 추가로, 이 원리를 이용하여 특정 문자열이 있는지 찾을 수 있고 어느 위치에 있는지도 알아 낼 수 있습니다.