문제 상황
C 프로그래밍을 이용해 문자열에 포함된 대문자 알파벳의 총 개수를 어떻게 확인할 수 있을까요?
해결 방법
문장 속 대문자 개수를 세는 데 사용한 핵심 로직은 다음과 같습니다.
for(a=string[0];a!='\0';i++){
a=string[i];
if (isupper(a)){
counter=counter+1;
}
}이 로직은 문자열의 첫 문자부터 널 문자('\0')가 나올 때까지 한 글자씩 검사하면서, 현재 문자가 대문자인지 isupper() 함수로 판별하고, 대문자일 경우 카운터 값을 1씩 증가시키는 방식입니다.
예제 1: isupper() 함수 활용
isupper() 함수는 ctype.h 헤더 파일에 정의되어 있으며, 전달된 문자가 대문자(A~Z)이면 참을 반환합니다.
#include<stdio.h>
#include<ctype.h>
void main(){
// 개수 계산용 변수와 문자열 선언
int i=0;
char a;
char string[50];
int counter=0;
// 사용자 입력 받기
printf("Enter the string :");
gets(string);
// for 반복문과 isupper() 함수로 대문자 개수 세기
for(a=string[0];a!='\0';i++){
a=string[i];
if (isupper(a)){
counter=counter+1;
}
}
// 대문자 개수 출력
printf("Capital letters in string : %d\n",counter);
}
실행 결과
Enter the string :TutoRialsPoint CPrograMMing
Capital letters in string : 7
입력된 문자열 "TutoRialsPoint CPrograMMing"에는 T, R, P, C, P, M, M 등 총 7개의 대문자가 포함되어 있으며, 프로그램이 정확히 그 개수를 출력하는 것을 확인할 수 있습니다.
예제 2: isupper() 없이 대문자 개수 세기
다음 프로그램은 isupper() 함수를 사용하지 않고, 문자의 아스키 코드 값이 'A'(65) 이상이고 'Z'(90) 이하인지 직접 비교하여 대문자를 판별합니다.
#include<stdio.h>
int main(){
int upper = 0;
char string[50];
int i;
printf("enter The String : \n");
gets(string);
i = 0;
while(string[i]!= ' '){
if (string[i] >= 'A' && string[i] <= 'Z')
upper++;
i++;
}
printf("\nUppercase Letters : %d", upper);
return (0);
}
실행 결과
enter The String :
TutOrial
Uppercase Letters : 2
입력된 문자열 "TutOrial"에는 T와 O 두 개의 대문자가 있으므로 결과값 2가 출력됩니다. 단, 이 예제는 반복 조건이 공백 문자(' ')를 만나면 종료되도록 작성되었기 때문에, 공백 뒤의 문자들은 검사하지 않는다는 점에 유의해야 합니다.
참고 사항
gets()함수는 입력 크기를 제한할 수 없어 버퍼 오버플로 위험이 있어 C11 표준에서 제거되었습니다. 실제 프로젝트에서는fgets()사용을 권장합니다.isupper()를 사용하려면 반드시ctype.h헤더 파일을 포함해야 합니다.- 아스키 코드 비교 방식은 별도의 헤더 없이 동작하지만, 영문 알파벳 외의 확장 문자 환경에서는
isupper()처럼 로캘을 고려하지 못한다는 차이가 있습니다.