코딩일기/자격증

[정보처리기사] [ C ] 문자열 역순 출력 | 2024년 1회 정보처리기사 실기 기출문제

jhy_2023 2025. 3. 25. 23:32
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
반응형