본문 바로가기
프로그래밍 언어/C, C++ 다양한 예시들

[C 예제] 단어 카운트

by Physics 2022. 3. 24.
728x90

 입력을 읽고 카운트한 단어의 수를 보고하는 프로그램을 만들려고 한다. 이때, 문자 수, 라인 수, 그리고 단어 수를 카운트 할 수 있어야 한다. 

1. 입력과 프로그램의 종료는 어떻게 다룰 것인가? 
 a. 입력: getchar()함수를 이용 
 b. 프로그램의 종료: 약속된 특정한 문자를 입력할 시, 프로그램이 종료되도록 함 

2. 문자 수, 라인수, 단어 계산하는 방법 
 a. 문자 수 계산: 매 루프 사이클 마다 카운터를 증가시킴
 b. 라인 수 계산: 만약 입력이 개행문자이면, 라인 카운트를 증가시킴
 c. 단어 계산
    - 문제를 단순히 하기 위해, 화이트 스페이스가 포함되어있지 않은 문자들의 한 시퀀스를 단어로 정의 
    - 단어는 화이트 스페이스가 아닌 문자에서부터 다음 화이트 스페이스 문자까지이다. 
    - 플래그를 0 또는 1로 지정하여, 어떤 문자가 여전히 한 단어에 속하는지를 추적한다. 
      (화이트스페이스를 만날 때, inword = 0로 지정하여 새로운 단어가 시작하는지를 추적) 
    - 문자가 화이트 스페이스인지 아닌지에 대한 검사는 ctype.h의 isspace()를 이용함 

3. 코드 

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
#define STOP '|'

int main(void){
    char c;                       // 현재 읽은 문자 
    char prevl;                   // 바로 전에 읽은 문자	
    long n_chars = 0L;	          // 문자 수
    int n_lines = 0;	          // 라인 수
    int n_words = 0;	          // 단어 수 
    int p_lines = 0;	          // 불완전 라인 수
    bool inword = false;          // c가 여전히 한 단어에 속해 있으면 true
    
    printf("분석할 영문 텍스트를 입력하시오(끝내려면 |):\n");
    prev = '\n';                  // 라인을 식별하는데 사용함 
    
    while((c = getchar()) != STOP){
    	n_char ++;                // 문자를 카운트 함
        if (c = '\n') n_lines ++; // 라인을 카운트 함	
        if (!isspace(c) && !inword){
        	inword = true;	      // 새 단어를 시작함  
            n_words ++;		      // 단어를 카운트 함
        }
        if (isspace(c) && inword) inword = false;	//단어의 끝에 도달함 
        prev = c;		// 문자의 값을 보관함 
    }
    
    if (prev != '\n') p_lines = 1;
    printf("문자 수: %ld, 단어 수 = %d, 라인 수 = %d, 불완전 라인 수 = %d\n", 
    		n_chars, n_words, n_lines, p_lines);

}
728x90

댓글