코딩일기/자격증

[정보처리기사] [ C ] isupper/islower/isdigit 문자 판별 함수 | 아스키코드 | 2024년 1회 정보처리기사 실기 기출문제

jhy_2023 2025. 4. 7. 17:33
728x90
반응형

2024년 1회 정보처리기사 실기 기출문제

문제

다음 C 프로그램의 실행결과를 쓰시오.

#include<stdio.h>
#include<ctype.h>
 
int main(){
    char* p = "It is 8";
    char result[100];
    int i;
 
    for(i = 0; p[i] != '\0'; i++){
        if(isupper(p[i]))
            result[i] = (p[i] - 'A' + 5) % 25 + 'A';
        else if(islower(p[i]))
            result[i] = (p[i] - 'a' + 10) % 26 + 'a';
        else if(isdigit(p[i]))
            result[i] = (p[i] - '0' + 3) % 10 + '0';
        else if(!(isupper(p[i]) || islower(p[i]) || isdigit(p[i])))    
            result[i] = p[i];
    }
 
    result[i] = '\0';
    printf("%s\n", result);
 
    return 0;
}

정답

Nd sc 1

반응형

해설

▼ 비슷한 기출 문제도 같이 풀어보세요

 

[정보처리기사] [ C ] 문자열 문자 변환 함수 | 아스키코드 | 2024년 1회 정보처리기사 실기 기출문

2024년 1회 정보처리기사 실기 기출문제문제다음 C 프로그램의 실행결과를 쓰시오.#include #include void isUpper(char *str);void isLower(char *str);void isNum(char *str);char str[] = "It is 8";int main() { int i = 0; while (i = 'A

august-jhy.tistory.com


1️⃣  main 함수 변수 초기화

int main(){
    char* p = "It is 8";
    char result[100];
    int i;
  • int main()
    • C 프로그램의 진입점(entry point)인 함수입니다.
    • 프로그램 실행 시 가장 먼저 호출되며, 전체 흐름을 제어하는 시작점입니다.
  • char* p = "It is 8";
    • p는 문자열 리터럴 "It is 8"을 가리키는 문자 포인터(char)입니다.
    • 문자열 리터럴은 "I", "t", " ", "i", "s", " ", "8", 그리고 문자열의 끝을 나타내는 널 문자('\0')로 구성되어 있으며, 메모리에 연속적으로 저장됩니다.
    • 포인터 p에는 이 문자열의 첫 번째 문자 'I'가 저장된 메모리 주소가 저장됩니다.
      즉, 포인터는 문자 그 자체를 저장하는 것이 아니라, **문자가 저장된 위치(주소)**를 저장합니다.
    • p[0]은 'I', p[1]은 't'와 같이 배열처럼 접근하여 문자를 읽을 수 있으며,
      포인터는 이러한 배열 방식([])으로도 활용할 수 있습니다.
    • 문자열 리터럴은 **읽기 전용(Read-only)**으로 취급되므로, 일반적으로 값을 수정하지 않고 읽기만 할 때 사용됩니다.
  • char result[100];
    • result는 암호화된 결과 문자열을 저장하기 위한 문자 배열입니다.
    • char형 데이터를 최대 100개까지 저장할 수 있는 배열로, [] 안의 숫자 100은 배열의 크기를 의미합니다.
    • 배열은 같은 자료형의 데이터를 연속적으로 저장하는 공간이며, 각 요소는 인덱스로 접근할 수 있습니다.
      예를 들어, result[0], result[1], ..., result[99]까지 접근이 가능합니다.
    • C 언어에서 문자열은 마지막에 반드시 널 문자('\0')를 포함해야 하므로, 여유 있는 크기로 배열을 선언하는 것이 일반적입니다.
    • 이 배열은 이후에 문자 변환 결과를 저장한 후 출력하는 용도로 사용됩니다.
  • int i;
    • for 반복문에서 인덱스로 사용할 정수형 변수입니다.
    • 문자열의 각 문자를 순회하면서 위치를 추적하는 데 사용됩니다.

728x90

2️⃣ for문을 이용한 문자 순회 및 변환 처리

for(i = 0; p[i] != '\0'; i++){
        if(isupper(p[i]))
            result[i] = (p[i] - 'A' + 5) % 25 + 'A';
        else if(islower(p[i]))
            result[i] = (p[i] - 'a' + 10) % 26 + 'a';
        else if(isdigit(p[i]))
            result[i] = (p[i] - '0' + 3) % 10 + '0';
        else if(!(isupper(p[i]) || islower(p[i]) || isdigit(p[i])))    
            result[i] = p[i];
    }

🔶 for문 개요

for(i = 0; p[i] != '\0'; i++) {
    ...
}

for(i = 0; p[i] != '\0'; i++)
이 반복문은 문자열 p의 각 문자를 순차적으로 순회합니다.
조건식 p[i] != '\0'은 문자열의 끝을 의미하는 **널 문자(\0)**가 나올 때까지 반복하라는 의미입니다. 즉, "It is 8" 문자열의 모든 문자가 처리될 때까지 반복됩니다.
i는 배열 인덱스처럼 사용되며, p[i]를 통해 문자열의 i번째 문자를 가져옵니다.

🔶 문자 판별 및 변환 처리

 if(isupper(p[i]))
            result[i] = (p[i] - 'A' + 5) % 25 + 'A';
        else if(islower(p[i]))
            result[i] = (p[i] - 'a' + 10) % 26 + 'a';
        else if(isdigit(p[i]))
            result[i] = (p[i] - '0' + 3) % 10 + '0';
        else if(!(isupper(p[i]) || islower(p[i]) || isdigit(p[i])))    
            result[i] = p[i];

이 반복문 안에서는 p[i]가 어떤 유형의 문자인지에 따라 각각 다르게 처리합니다. 이를 위해 <ctype.h> 헤더에 정의된 문자 판별 함수들을 사용합니다:

  • isupper(int c) : 문자가 대문자 알파벳(A ~ Z)인지 확인
  • islower(int c) : 문자가 소문자 알파벳(a ~ z)인지 확인
  • isdigit(int c) : 문자가 숫자 문자(0 ~ 9)인지 확인

🔶 for문 처리

  • ASCII(American Standard Code for Information Interchange)는
    컴퓨터가 문자를 숫자로 표현하기 위해 사용하는 표준 코드입니다.
    • 대문자 'A' ~ 'Z' : 65 ~ 90
    • 소문자 'a' ~ 'z' : 97 ~ 122
    • 숫자 문자 '0' ~ '9' : 48 ~ 57
  • 첫 번째 문자 'I'
    • isupper('I')는 참(true)이므로 대문자 처리 로직이 실행됩니다.
    • 'I'는 아스키코드로 73이고, 'A'는 65이므로 p[i] - 'A'는 8입니다.
    • 여기에 +5를 더하고, 25로 나눈 나머지를 계산해 다시 'A'를 더하면 (8 + 5) % 25 + 'A' = 13 + 65 = 78이므로 결과는 'N'이 됩니다.
    • 따라서 result[0] = 'N'이 됩니다.
  • 두 번째 문자 't'
    • islower('t')는 참이므로 소문자 처리 로직이 실행됩니다.
    • 't' - 'a' = 19, 여기에 +10을 더해 26으로 나눈 나머지를 구하면 (19 + 10) % 26 = 3이 되고, 다시 'a'를 더하면 97 + 3 = 'd'가 됩니다.
    • 따라서 result[1] = 'd'가 됩니다.
  • 세 번째 문자 ' ' (공백)
    • 공백 문자는 대문자, 소문자, 숫자가 아니므로 위 세 조건에 모두 해당하지 않으며, else if(!(isupper || islower || isdigit)) 조건에 해당합니다.
    • 이 조건은 기호, 공백, 특수문자 등에 해당하며, 이 경우는 문자를 그대로 복사합니다.
    • 따라서 result[2] = ' '가 됩니다.
  • 네 번째 문자 'i'
    • islower('i')가 참이므로 소문자 처리 로직이 실행됩니다.
    • 'i' - 'a' = 8, 여기에 10을 더해 (8 + 10) % 26 = 18이고, 다시 'a'를 더해 97 + 18 = *s'가 됩니다.
    • 따라서 result[3] = 's'가 됩니다.
  • 다섯 번째 문자 's'
    • 역시 소문자이므로 소문자 처리 로직을 따라갑니다.
    • 's' - 'a' = 18, (18 + 10) % 26 = 2, 97 + 2 = *c'가 됩니다.
    • 따라서 result[4] = 'c'가 됩니다.
  • 여섯 번째 문자 ' ' (공백)
    • 앞서와 마찬가지로 공백은 그대로 복사되어 result[5] = ' '가 됩니다.
  • 일곱 번째 문자 '8'
    • 숫자이므로 isdigit('8')가 참입니다.
    • '8' - '0' = 8, 여기에 3을 더해 (8 + 3) % 10 = 1, 다시 '0'을 더해 48 + 1 = *1'이 됩니다.
    • 따라서 result[6] = '1'이 됩니다.

3️⃣ 출력

   result[i] = '\0';
   printf("%s\n", result);
 
   return 0;
  • 마지막에 널 문자 '\0'를 넣는 이유는 문자열의 끝을 표시하기 위해서입니다. C 언어에서 문자열은 '\0'를 만나기 전까지의 문자들을 의미하기 때문에, printf("%s", result);처럼 문자열을 출력할 때 컴퓨터가 어디까지 출력해야 할지 정확히 알 수 있게 해주는 역할을 합니다.
    • %s : 문자열 출력
    • %d : 정수 출력
    • %c : 문자 하나 출력위 코드는 모든 문자 변환 작업이 끝난 뒤, 결과 문자열을 result 배열에 저장한 다음 %s 서식 지정자를 사용해 문자열 전체를 한 번에 출력합니다.
  • \n은 출력 후 줄바꿈을 의미합니다.
  • 따라서 결과 : Nd sc 1이 출력됩니다.

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형