초보자를 위한 C/C++ 연습

C와 C++로 문자열의 모음 세기

이 레슨에서는 대소문자 차이를 무시하고 한 줄의 텍스트에 들어 있는 모음을 셉니다.

소개

모음 세기에는 세 가지 기술이 함께 쓰입니다. 문자열의 각 문자를 돌아보고, 문자를 소문자로 바꾸고, 문자가 어떤 집합에 속하는지 확인하는 것입니다. 영어의 모음은 a, e, i, o, u입니다.

핵심 정리

  • 컴파일러 경고(compiler warnings)를 켜고 모두 고치세요.
  • 각 값의 타입과 수명(lifetime)을 정확히 이해하세요.
  • 입력 데이터와 배열 인덱스의 범위를 항상 확인하세요.

C와 C++ 코드 예제

C
실행 →
main.c
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int main(void) {
    const char *text = "Code Utility"; int count = 0;
    // strchr performs a compact membership check.
    for (; *text; ++text) if (strchr("aeiou", tolower((unsigned char)*text))) ++count;
    printf("vowels=%d\n", count);
}
실행 결과
vowels=5
C++
실행 →
main.cpp
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
int main() {
    std::string text = "Code Utility";
    // count_if counts characters accepted by the predicate.
    auto vowels = std::count_if(text.begin(), text.end(), [](unsigned char c) {
        return std::string("aeiou").find(std::tolower(c)) != std::string::npos;
    });
    std::cout << "vowels=" << vowels << '\n';
}
실행 결과
vowels=5

C와 C++ 비교

tolower 함수가 각 문자를 소문자로 바꾸므로 대문자와 소문자가 똑같이 처리됩니다. 특수 문자에서 생기는 문제를 피하기 위해 tolower에 넘기기 전에 문자를 unsigned char로 변환합니다. strchr("aeiou", ...) 함수는 문자가 모음 문자열 안에 있으면 NULL이 아닌 포인터를 돌려주고, 그러면 개수가 늘어납니다. 문자열 "Code Utility"에는 모음이 5개 있습니다.

C

C는 작은 절차형 함수를 쓰고, 데이터가 메모리에 어떻게 표현되는지 그대로 드러냅니다.

C++

C++는 여전히 저수준 작업을 할 수 있으면서, 라이브러리 타입과 더 안전한 추상화를 더합니다.

연습 문제

두 버전을 모두 실행한 다음 코드를 바꿔 보면서 각 언어가 주는 안전성의 차이를 살펴보세요.

  • 잘못된 입력과 경계값으로 테스트해 보세요.
  • -Wall -Wextra -Wpedantic 옵션으로 컴파일해 경고를 더 많이 켜 보세요.
  • 공통 선언은 헤더 파일에, 구현은 별도의 파일에 두어 보세요.

챌린지로 연습하기

이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.

모든 챌린지