코딩일기/자격증
[정보처리기사] [ 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
반응형