728x90
반응형
2024년 1회 정보처리기사 실기 기출문제
문제
다음 C 코드의 실행 결과를 구하시오.
#include <stdio.h>
#include <string.h>
int main(){
char str[] = "ABCDEFGH";
char *fir_str;
char *end_str;
fir_str = &str[0];
end_str = &str[strlen(str)-1];
while(fir_str < end_str){
char temp = *fir_str;
*fir_str = *end_str;
*end_str = temp;
fir_str++;
end_str--;
}
for(int i=1; i<strlen(str); i+=2){
printf("%c",str[i]);
}
}
정답
GECA
반응형
해설
📌 기본 개념
1️⃣ 포인터
🔶 포인터 선언 및 사용
포인터(Pointer)는 변수의 주소(Address)를 저장하는 변수입니다.
즉, 특정 변수의 메모리 주소를 가리키며, 이를 통해 해당 변수의 값을 간접적으로 조작할 수 있습니다.
포인터를 선언할 때는 자료형 뒤에 *(애스터리스크)를 붙여서 선언합니다.
int a = 10; // 일반 변수 선언
int *p = &a; // 포인터 변수 선언 및 초기화
printf("%d\n", *p); // 출력: 10
- int *p; → 정수를 가리키는 포인터 선언
- p = &a; → 변수 a의 주소를 p에 저장
- *p → 포인터 p가 가리키는 주소의 값을 가져옴 (간접 참조)
🔶 문자열과 포인터
C 언어에서 문자열은 문자 배열로 저장되며, 포인터를 사용하면 문자열을 쉽게 조작할 수 있습니다.
char str[] = "HELLO";
char *p = &str[0]; // 문자열의 첫 번째 문자 주소 저장
printf("첫 번째 문자: %c\n", *p); // 'H' 출력
- 문자열 "HELLO"를 배열에 저장. 내부적으로 {'H', 'E', 'L', 'L', 'O', '\0'}처럼 저장됨 (\0은 문자열 끝을 나타냄)
- 포인터 p가 str의 첫 번째 문자('H')의 주소를 가리킴
- *p는 포인터 p가 가리키는 주소의 값을 가져옴. 즉, 'H' 출력
2️⃣ strlen() 함수
🔶 strlen() 동작 방식
strlen()은 C 표준 라이브러리 함수입니다. 이 함수는 문자열의 길이(문자 개수)를 반환합니다. strlen(str)은 문자열 str에서 널 문자(\0)가 나올 때까지 문자를 하나씩 세어서 개수를 반환합니다.
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello";
printf("문자열 길이: %lu\n", strlen(str));
return 0;
}
// 출력 결과
// 문자열 길이: 5
예를 들어, "Hello"라는 문자열을 strlen()에 전달하면 다음과 같이 동작합니다. "Hello"는 문자 'H', 'e', 'l', 'l', 'o' 5개로 구성되어 있으며,
널 문자 \0는 포함되지 않으므로 5가 반환됩니다.
728x90
📌 문제 해설
#include <stdio.h>
#include <string.h>
int main(){
char str[] = "ABCDEFGH";
char *fir_str;
char *end_str;
fir_str = &str[0];
end_str = &str[strlen(str)-1];
while(fir_str < end_str){
char temp = *fir_str;
*fir_str = *end_str;
*end_str = temp;
fir_str++;
end_str--;
}
for(int i=1; i<strlen(str); i+=2){
printf("%c",str[i]);
}
}
1️⃣ 문자열 선언 및 포인터 변수 초기화
char str[] = "ABCDEFGH";
char *fir_str;
char *end_str;
- char str[] = "ABCDEFGH";
- str 배열에 문자열 "ABCDEFGH"를 저장
- str[0] = 'A', str[1] = 'B', ..., str[7] = 'H'
- char *fir_str, *end_str;
- 문자열의 첫 번째 문자와 마지막 문자를 가리킬 포인터 변수 선언
fir_str = &str[0];
end_str = &str[strlen(str)-1];
- fir_str → str[0]을 가리킴 ('A')
- end_str → str[strlen(str)-1], 즉 str[7]을 가리킴 ('H')
- strlen(str) → 문자열 "ABCDEFGH"의 길이 8을 반환
- str[7] = 'H'이므로 end_str = &str[7];
- [ 현재 상태 표 ]
A | B | C | D | E | F | G | H |
0x1000 | 0x1001 | 0x1002 | 0x1003 | 0x1004 | 0x1005 | 0x1006 | 0x1007 |
fir_str | end_str |
- fir_str = &str[0] → fir_str은 0x1000 (문자 'A'의 주소)를 가리킴
- end_str = &str[strlen(str)-1] → end_str은 0x1007 (문자 'H'의 주소)를 가리킴
2️⃣ 문자열 뒤집기
while(fir_str < end_str){
char temp = *fir_str;
*fir_str = *end_str;
*end_str = temp;
fir_str++;
end_str--;
}
- while(fir_str < end_str){
- fir_str < end_str 조건이 참일 동안 해당 while문이 반복됩니다.
- fir_str과 end_str는 각각 str 배열의 주소를 가리키고 있습니다.
- fir_str < end_str는 fir_str이 가리키는 주소가 end_str이 가리키는 주소보다 작은지를 확인하는 것입니다.
- 메모리에서는 주소가 순차적으로 증가하므로, fir_str이 end_str보다 작은 주소를 가리키고 있다는 의미는 fir_str이 end_str보다 왼쪽에 있다는 것입니다.
- char temp = *fir_str;
- *fir_str: fir_str이 가리키고 있는 주소의 값을 가져옵니다. 처음에는 fir_str이 str[0]을 가리키고 있으므로 *fir_str은 'A'입니다.
- temp: fir_str이 가리키는 값을 임시로 저장할 변수입니다. *fir_str에서 가져온 값을 temp에 저장하여, 이후에 값을 교환할 때 사용할 수 있도록 합니다.
- *fir_str = *end_str;
- end_str이 str[7]을 가리키고 있으므로 *end_str은 'H'입니다.
- fir_str이 가리키는 위치에 end_str이 가리키는 값을 저장하는 동작입니다. fir_str이 가리키는 'A' 자리에 'H'를 넣습니다.
- *end_str = temp;
- temp에는 fir_str이 가리켰던 값이 저장되어 있습니다. *end_str에 그 값을 저장합니다.
- 즉, end_str이 가리키고 있던 'H' 자리에 fir_str이 가리키고 있던 값인 'A'를 저장합니다.
- fir_str++;
- fir_str 포인터를 오른쪽으로 한 칸 이동시킵니다.
- 처음에는 fir_str이 str[0]을 가리키고 있기 때문에, 한 번 실행하면 fir_str은 str[1]을 가리키게 됩니다.
- end_str--;
- end_str 포인터를 왼쪽으로 한 칸 이동시킵니다.
- 처음에는 end_str이 str[7]을 가리키고 있기 때문에, 한 번 실행하면 end_str은 str[6]을 가리키게 됩니다.
- 반복문 종료
- fir_str이 end_str과 같거나 end_str이 fir_str을 지나면 더 이상 반복하지 않음.
- 최종 문자열은 "HGFEDCBA"로 뒤집힘.
- 각 반복 과정 정리
3️⃣ 문자 출력
for(int i=1; i<strlen(str); i+=2){
printf("%c", str[i]);
}
- i=1부터 시작하여 i를 2씩 증가시키면서 문자 출력.
- strlen(str) → 문자열 "ABCDEFGH"의 길이 8을 반환
- GECA 출력
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
728x90
반응형
'코딩일기 > 자격증' 카테고리의 다른 글
[정보처리기사] SQL | JOIN 기본 개념과 종류 | 정보처리기사 실기 기출문제 (0) | 2025.04.01 |
---|---|
[정보처리기사] 서브넷과 서브넷 마스크 | 2024년 1회 정보처리기사 실기 기출문제 (0) | 2025.03.27 |
[정보처리기사] [ C ] 삼항 연산자와 비트 연산자(시프트 연산자) 활용 | 2024년 1회 정보처리기사 실기 기출문제 (0) | 2025.03.25 |
[정보처리기사] [Java] static 변수와 메서드 | 싱글톤 패턴 | 정보처리기사 실기 기출문제(2024년 1회) (0) | 2025.03.23 |
[정보처리기사] [Java] static 변수와 메서드 이해 | 싱글톤 패턴 활용 | 정보처리기사 실기 기출문제(2021년 3회) (0) | 2025.03.23 |