개요
이 튜토리얼에서는 C 언어를 활용해 사용자가 입력한 문자열에서 총 단어 수, 모음 개수, 그리고 사용자가 지정한 특정 문자의 등장 빈도를 한 번의 반복문으로 동시에 계산하는 방법을 소개합니다.
예를 들어 "I love my MOM"이라는 문자열과 문자 'M'을 입력하면 다음과 같은 결과를 얻을 수 있습니다.
입력 : 문자열 입력 : I love my MOM
찾을 문자 입력 : M
M의 총 빈도 : 2
총 모음 개수 : 4
총 단어 수 : 4알고리즘
프로그램의 전체적인 동작 흐름은 다음과 같습니다.
시작
1단계 : 문자열 배열 str, 문자 ch, 정수 i를 선언하고 freq = 0, vow = 0, word = 0으로 초기화
2단계 : 문자열과 찾고자 하는 문자 ch를 입력받는다
3단계 : i = 0부터 str[i]가 '\0'이 아닐 때까지 반복 (++i)
3.1단계 : IF 문으로 ch == str[i] 여부 확인 → 참이면 freq 증가
3.2단계 : IF 종료
3.3단계 : IF 문으로 str[i]가 모음(a, e, i, o, u 또는 대문자 A, E, I, O, U)인지 확인 → 참이면 vow 증가
3.4단계 : IF 종료
3.5단계 : IF 문으로 str[i]가 공백(' ')인지 확인 → 참이면 word 증가
3.6단계 : IF 종료
4단계 : 반복문 종료 후 결과 출력
종료예제 코드
#include <stdio.h>
int main() {
char str[1000], ch;
int i, freq=0, vow=0, word=0;
printf("Enter a string of your choice: ");
gets(str);
printf("Enter a character of which you want to find the frequency: ");
scanf("%c",&ch);
for(i = 0; str[i] != '\0'; ++i){
if(ch == str[i]) { // 특정 문자의 빈도 계산
++freq;
}
if(str[i]=='a'||str[i]=='e'||str[i]=='i'||str[i]=='o'||str[i]=='u'||str[i]=='A'||str[i]=='E'||str[i]=='I'||str[i]=='O'||str[i]=='U') {
++vow; // 모음 개수 계산
}
if (str[i] == ' ') {
word++; // 공백 개수 기반으로 단어 수 계산
}
}
printf("Frequency of %c = %d", ch, freq);
printf("\ntotal number of vowels in a string are %d " ,vow );
printf("\ntotal number of words in a string are %d " ,word+1 );
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 출력이 생성됩니다.
Enter a string of your choice: I love PrograMMIng Enter a character of which you want to find the frequency: M Frequency of M = 2 total number of vowels in a string are 6 total number of words in a string are 3
동작 원리 설명
핵심 로직은 하나의 for 반복문 안에서 문자열을 처음부터 끝까지('\0' 널 문자 직전까지) 한 글자씩 검사하는 것입니다.
- 문자 빈도(freq) : 현재 문자가 사용자가 입력한 문자
ch와 일치할 때마다 카운트를 1씩 증가시킵니다. 대소문자는 구분되므로 'M'과 'm'은 서로 다른 문자로 처리됩니다. - 모음 개수(vow) : 현재 문자가 소문자 또는 대문자 모음(a, e, i, o, u / A, E, I, O, U)에 해당하면 카운트를 증가시킵니다.
- 단어 수(word) : 공백 문자를 만날 때마다 카운트를 증가시키고, 마지막에
word + 1을 출력합니다. 이는 "공백 개수 + 1 = 단어 개수"라는 규칙을 이용한 방식입니다.
참고 사항
예제 코드에 사용된 gets() 함수는 입력 길이를 제한하지 못해 버퍼 오버플로우 위험이 있어 C11 표준에서 제거되었습니다. 실무에서는 다음과 같이 fgets()를 사용하는 것이 안전합니다.
fgets(str, sizeof(str), stdin);
또한 현재 단어 수 계산 방식은 단어 사이에 공백이 하나만 있는 경우를 가정합니다. 연속된 공백이나 탭 문자까지 정확하게 처리하려면, 이전 문자가 공백이 아니면서 현재 문자가 공백일 때만 카운트하거나 isspace() 함수를 활용하는 방식으로 개선할 수 있습니다.