카테고리 없음

프로그래머스 오답노트 - Buffer Overrun

dkuen 2026. 2. 25. 16:12

대소문자바꿔서 출력하기

 

문제 설명

영어 알파벳으로 이루어진 문자열 str이 주어집니다. 각 알파벳을 대문자는 소문자로 소문자는 대문자로 변환해서 출력하는 코드를 작성해 보세요.

 

제한사항

  • 1 ≤ str의 길이 ≤ 20
    • str은 알파벳으로 이루어진 문자열입니다.
    •  

입출력 예입력 #1출력 #1

 

AbCdEfG

 

aBcDeFg
#include <stdio.h>
#define LEN_INPUT 10

int main(void) {
    char s1[LEN_INPUT];
    scanf("%s", s1);

    return 0;
}

 

위 코드를 수정해서 출력하는 문제입니다.

 

먼저 제가 짠 코드입니다.

 

#include <stdio.h>
#define LEN_INPUT 10

int main(void) {
    char s1[LEN_INPUT];
    scanf("%s", s1);
    
    for(int i = 0; i < LEN_INPUT; i++){
        if(s1[i] >= 65 && s1[i] <= 90){
            s1[i] = s1[i] + 32;
        }
        else if(s1[i] >= 97 && s1[i] <= 122){
            s1[i] = s1[i] - 32;
        }
    }
    
    printf("%s", s1);
    
    return 0;
}

 

테스트 1
입력값 〉	"aBcDeFg
"
기댓값 〉	"AbCdEfG"
실행 결과 〉	테스트를 통과하였습니다.
출력 〉	AbCdEfG

 

출력은 제대로 되고있지만, 오답입니다.

 

저는 아스키코드를 이용해서 배열의 값을 바꾸는 방법으로 코드를 작성했습니다.

 

#include <stdio.h>
#define LEN_INPUT 21

int main(void) {
    char s1[LEN_INPUT];
    scanf("%s", s1);
    
    for(int i = 0; i < strlen(s1); i++){
        if(s1[i] >= 65 && s1[i] <= 90){
            s1[i] = s1[i] + 32;
        }
        else if(s1[i] >= 97 && s1[i] <= 122){
            s1[i] = s1[i] - 32;
        }
    }
    
    printf("%s", s1);
    
    return 0;
}

 

정답 코드입니다. 차이점은

 

먼저 상수값을 활용하려면, 간단하게 상수값을 바꾸면 됩니다.

그럼 굳이 for문의 조건을 안바꿔도 수정이 가능합니다.

 

두번째는 strlen함수를 활용합니다.

하지만 마찬가지로 상수값을 바꿔주어야 합니다.

 

프로그래머스에서는 상수값을 바꾸지 않고 for문의 조건을 strlen(s1)까지 해주면 정상 작동합니다.

이는 정상작동 하는 것처럼만 보이는 것입니다.

 

이렇게 하게 될 경우 배열의 크기보다 더 많은 값을 초기화 하면, 버퍼 오버플로우가 발생합니다 (버퍼 오버런이라고 부르기도 합니다)

#include<stdio.h>


int main() {

	int a[2];
	a[3] = 0;

	printf("%d", a[3]);
}

 

저는 컴파일 에러를 예상했는데 문제는 없는것으로 확인됩니다.

visual studio에서 실행했습니다.

 

 

버퍼 오버런이 발생합니다.

Buffer Overrun/Overflow은 프로그램이 할당된 메모리 버퍼 용량을 초과하는 데이터를 입력받아, 인접한 메모리 영역을 덮어쓰는 보안 취약점입니다.

 

게임으로 비유하자면,

디스크 용량이 10GB 밖에 안남았는데 15GB 게임을 다운받는 것과 같습니다.