코딩일기/자격증

[정보처리기사] [ C ] 포인터를 활용한 문자열 복사 | 2024년 2회 정보처리기사 실기 기출문제

jhy_2023 2025. 4. 18. 00:09
728x90
반응형

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

문제

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

#include <stdio.h>
#include <string.h>
 
void sumFn(char* d, const char* s) {
    while (*s) {
        *d = *s;
        d++;
        s++;
    }
    *d = '\0'; 
}
 
int main() {
    const char* str1 = "first";
    char str2[50] = "teststring";  
    int result = 0;
    sumFn(str2, str1);
 
    for (int i = 0; str2[i] != '\0'; i++) {
        result += i;
    }
    printf("%d", result);
    
    return 0;
}

정답

10

반응형

해설

1️⃣ main() 함수

int main() {
...
}
  • 프로그램은 항상 main() 함수부터 시작됩니다. 여기서부터 한 줄씩 실행되며 결과가 만들어집니다.
const char* str1 = "first";

  • 문자열 포인터 선언 및 초기화
    • str1은 "first"라는 문자열을 가리키는 문자형 포인터입니다.
    • "first"는 문자열 상수(const)이며, 프로그램 실행 중 변경이 불가능합니다.
    • 이 줄에서 중요한 점은 str1은 직접 데이터를 갖고 있는 것이 아니라, "first"가 저장된 메모리 주소를 가리키는 것이라는 점입니다.
char str2[50] = "teststring";

  • 문자 배열 선언 및 초기화
    • str2는 길이가 50인 문자 배열입니다. 즉, 50칸짜리 문자 저장 공간을 의미합니다.
    • 현재 "teststring"이라는 문자열이 들어가 있지만, 곧 다른 값으로 바뀌게 됩니다.
    • 이 배열은 문자열을 저장하거나 변경할 수 있는 가변 메모리 공간입니다.
    • 이후 함수 호출로 "first"라는 문자열로 덮어쓰기될 예정입니다.
int result = 0;
  • 나중에 계산된 값을 저장할 변수 result를 0으로 초기화합니다.
  • 이 변수는 반복문을 통해 인덱스를 누적하는 데 사용됩니다.
sumFn(str2, str1);
  • 사용자 정의 함수 sumFn() 호출
    • 문자열 복사 함수 sumFn을 호출합니다.
    • 여기서 복사 대상은 str2, 복사 원본은 str1입니다. 즉, "first"를 "teststring" 위에 덮어쓰기 하는 것입니다.
728x90

2️⃣ sumFn() 함수

void sumFn(char* d, const char* s) {
    while (*s) {
        *d = *s;
        d++;
        s++;
    }
    *d = '\0'; 
}

sumFn(d, s) 함수 실행 흐름 표

  • void sumFn(char* d, const char* s)
    • char* d: 문자열을 저장할 대상 포인터. 즉, str2입니다. teststring
    • const char* s: 문자열 원본 포인터. 즉, str1입니다. first
    • d와 s는 실제 배열이 아닌, 배열의 주소(시작 위치)를 전달받은 것입니다.
  • while (*s) {
    • *s는 s가 가리키는 현재 문자를 의미합니다. 예를 들어, s가 "first"를 가리킬 때, *s는 첫 번째 문자 'f'를 가리킵니다.
    • C언어에서 문자열은 항상 \0으로 끝나므로, *s가 \0일 때까지 반복이 계속됩니다. 즉, *s != '\0'인 동안만 반복문이 실행됩니다.
    • while (*s) 조건에서 *s는 \0이 아니면 참으로 평가되고, \0이면 거짓으로 평가되어 반복문이 종료됩니다. 즉, 문자열의 끝에 도달했을 때 반복문이 종료됩니다.
    • 이 반복문은 "first"라는 문자열을 끝까지 읽으며 한 글자씩 복사하게 됩니다.
  • *d = *s;
    • 현재 s가 가리키는 문자를, d가 가리키는 위치에 저장합니다.
    • 예를 들어 s가 'f'를 가리키면, d 위치에 'f'가 저장됩니다.
  • d++;
    s++;
    • 문자 하나를 복사한 뒤, 두 포인터를 모두 한 칸 앞으로 이동시킵니다.
    • 다음 문자를 복사하기 위한 준비입니다.
  • }
    *d = '\0';
    • 복사가 끝났다면, 마지막에 '\0'을 추가합니다.
    • 이로써 str2는 문자열 "first"로 완전히 바뀌게 됩니다. 즉, 이 함수는 "teststring"이라는 초기값을 "first"로 덮어쓰기합니다.
    • [ 참고 ]
      str2 = [ 'f', 'i', 'r', 's', 't', '\0', 'r', 'i', 'n', 'g', '\0', ..., ... ]
                   ↑ 시작 주소
      "first"가 앞부분에 복사되고, 그 다음에 \0이 붙습니다. "tring"의 일부 문자(r, i, n, g)는 메모리에 그대로 남아있습니다. 하지만, C 언어에서는 문자열을 '\0'까지 읽기 때문에, str2는 "first"까지만 인식됩니다. printf("%s", str2);와 같은 함수는 '\0'을 만나면 출력을 멈춥니다. 따라서 "first\0ring"처럼 되어 있어도, "first"까지만 보입니다.

3️⃣ main() 함수 - 복사 완료 후 반복문 진입

for (int i = 0; str2[i] != '\0'; i++) {
    result += i;
}

 

실행 흐름 표

  • 이제 str2는 "first"입니다.
  • 이 반복문은 문자열이 끝날 때까지 한 글자씩 확인하며, 인덱스를 result에 누적합니다.
    • i = 0: 첫 글자 'f' → result = 0 + 0 = 0
    • i = 1: 두 번째 글자 'i' → result = 0 + 1 = 1
    • i = 2: 세 번째 글자 'r' → result = 1 + 2 = 3
    • i = 3: 네 번째 글자 's' → result = 3 + 3 = 6
    • i = 4: 다섯 번째 글자 't' → result = 6 + 4 = 10
    • i = 5: str2[5]는 '\0' (널 문자) → 문자열 종료, 반복문 탈출

 

4️⃣ main() 함수 - 출력

 printf("%d", result);
  • 반복문이 종료될 때 result 값은 10입니다.
  • 이 값이 최종적으로 printf()를 통해 출력됩니다.

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

728x90
반응형