C와 C++로 문장의 단어 세기
이 레슨에서는 문자열을 돌면서 프로그램의 상태를 추적해 공백으로 구분된 단어를 셉니다.
소개
단어를 믿을 만하게 세는 방법은 프로그램이 지금 단어 안에 있는지 공백에 있는지를 아는 것입니다. 공백에서 공백이 아닌 문자로 넘어갈 때마다 새 단어가 시작됩니다. 이 방법은 공백이 여러 개 이어져 있어도 동작합니다.
핵심 정리
- 컴파일러 경고(compiler warnings)를 켜고 모두 고치세요.
- 각 값의 타입과 수명(lifetime)을 정확히 이해하세요.
- 입력 데이터와 배열 인덱스의 범위를 항상 확인하세요.
C와 C++ 코드 예제
C
main.c
#include <ctype.h>
#include <stdio.h>
int main(void) {
const char *text = "C and C++ examples"; int words = 0, inside = 0;
// Count transitions from whitespace into a word.
for (; *text; ++text) { if (isspace((unsigned char)*text)) inside = 0; else if (!inside) { ++words; inside = 1; } }
printf("words=%d\n", words);
}
words=4
C++
main.cpp
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::istringstream input("C and C++ examples"); std::string word; int words = 0;
// Formatted extraction skips whitespace and returns one word.
while (input >> word) ++words;
std::cout << "words=" << words << '\n';
}
words=4
C와 C++ 비교
변수 inside는 현재 위치가 단어 안인지를 나타냅니다. isspace로 확인해 공백을 만나면 inside를 0으로 되돌립니다. inside가 0인데 다른 문자가 나오면 프로그램은 개수 words를 늘리고 inside를 1로 만듭니다. 문장 "C and C++ examples"에는 단어가 4개 있습니다.
C
C는 작은 절차형 함수를 쓰고, 데이터가 메모리에 어떻게 표현되는지 그대로 드러냅니다.
C++
C++는 여전히 저수준 작업을 할 수 있으면서, 라이브러리 타입과 더 안전한 추상화를 더합니다.
연습 문제
두 버전을 모두 실행한 다음 코드를 바꿔 보면서 각 언어가 주는 안전성의 차이를 살펴보세요.
- 잘못된 입력과 경계값으로 테스트해 보세요.
- -Wall -Wextra -Wpedantic 옵션으로 컴파일해 경고를 더 많이 켜 보세요.
- 공통 선언은 헤더 파일에, 구현은 별도의 파일에 두어 보세요.
챌린지로 연습하기
이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.
모든 챌린지