C 프로그래밍에서 문자열을 분석하는 것은 기초적이면서도 자주 활용되는 작업입니다. 이번 글에서는 사용자가 입력한 문장에서 대문자, 소문자, 숫자, 공백, 특수문자의 개수를 각각 세어 출력하는 C 프로그램을 소개합니다.
전체 코드
#include <stdio.h>
int main() {
char str[100];
int i;
int upper = 0, lower = 0, number = 0, special = 0, whitesp = 0;
printf("enter string");
gets(str);
for (i = 0; str[i] != '\0'; i++) {
if (str[i] >= 'A' && str[i] <= 'Z')
upper++;
else if (str[i] >= 'a' && str[i] <= 'z')
lower++;
else if (str[i] >= '0' && str[i] <= '9')
number++;
else if (str[i] == ' ')
whitesp++;
else
special++;
}
printf("Upper case letters: %d\n", upper);
printf("Lower case letters: %d\n", lower);
printf("Numbers: %d\n", number);
printf("Whitespace: %d\n", whitesp);
printf("Special characters: %d\n", special);
return 0;
}
코드 동작 원리
1. 변수 선언
char str[100]은 최대 99글자를 저장할 수 있는 문자 배열이며, upper(대문자), lower(소문자), number(숫자), whitesp(공백), special(특수문자) 변수는 각 항목의 개수를 저장하기 위해 모두 0으로 초기화됩니다.
2. 반복문과 조건 분기
for 루프는 문자열의 끝을 알리는 널 문자('\0')를 만날 때까지 한 글자씩 검사하며, 아스키(ASCII) 코드 값 범위를 기준으로 문자를 분류합니다.
- 대문자: 'A'~'Z' 범위에 해당하면
upper++ - 소문자: 'a'~'z' 범위에 해당하면
lower++ - 숫자: '0'~'9' 범위에 해당하면
number++ - 공백: 공백 문자(' ')와 일치하면
whitesp++ - 특수문자: 위 어느 조건에도 해당하지 않으면
special++
3. 결과 출력
모든 문자 검사가 끝나면 printf() 함수와 정수 서식 지정자 %d를 사용해 각 항목별 개수를 차례로 화면에 출력합니다.
실행 결과 예시
"Hello World! 123"이라는 문장을 입력했다면 결과는 다음과 같습니다.
Upper case letters: 2 Lower case letters: 8 Numbers: 3 Whitespace: 2 Special characters: 1
주의 사항 및 개선 팁
- gets() 함수 주의: 입력 길이를 제한할 수 없어 버퍼 오버플로우 위험이 있으며 C11 표준에서 삭제되었습니다. 실무에서는
fgets(str, sizeof(str), stdin)을 사용하는 것이 안전합니다. - 루프 변수 자료형: 인덱스 변수
i는char보다int로 선언하는 것이 바람직합니다. - 조건 단순화: 루프 조건은
str[i] != '\0'만으로 충분하며, 불필요한 비교 연산은 제거하는 것이 좋습니다. - ctype.h 헤더 활용:
isupper(),islower(),isdigit(),isspace()등의 표준 라이브러리 함수를 사용하면 더 간결하고 이식성 좋은 코드를 작성할 수 있습니다.
마무리
이 예제는 문자열 순회, 아스키 코드 비교, 조건문 활용이라는 C 언어의 핵심 개념을 모두 담고 있습니다. 코드를 직접 작성하고 다양한 문장을 입력해 보면서 동작 원리를 확실히 익혀 보시기 바랍니다.