c언어 관련질문입니다.

sky1020의 이미지

이 코드가 문자열을 뒤집는 코드인데 실행했을때는 잘 되는데 테스트 케이스나 제출하니까 timeout: the monitored command dumped core
make: *** [cmd] Error 139 이러한 에러가 발생합니다. 무슨 문제인지 잘 모르겠습니다. 도와주세요

#include<stdio.h>
int main()
{
	char c;
	char arr[100]={};
	char rev_arr[100]={};
	int i =0;
 
	printf("Enter the word : ");
	scanf("%c", &c);
 
	while(c != '\n') {
 
		arr[i] = c;
		i+=1;
		scanf("%c", &c);
	}
 
 
	int size,j;
 
	size=i;
 
	for(j=0;j<size;j++){
 
		rev_arr[j] = arr[size-1-j];
	}
 
	rev_arr[size]=0;
 
	printf("Word Length : %d\n",size);
	printf("Reverse word : %s",rev_arr);
 
	return 0;	
}
나빌레라의 이미지

일단 실행은 안해 봤습니다. 그냥 눈으로만 코드를 읽었을 때 바로 보이는 문제는 arr 배열보다 큰 입력이 들어오면 버퍼 오버 플로우입니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

sky1020의 이미지

답변 감사합니다만 입력받는 word가 크기가 1~100으로 고정되어 있습니다. 다른 문제는 없을까요??

나빌레라의 이미지

rev_arr[101]

일지도요. 안돌려봐서 결과는 모르겠습니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

swish95의 이미지

timeout 이면 '\n' 이 입력 되기전에 나빌레라 님 말처럼 버퍼를 넘어갔겠네요
while 문의 조건에 size 조건을 추가하시면 되겠네요

그리고 while {} 문을 do { } while 로 바꾸면 scanf 를 한번만 써도 되겠군요

------------------------------------------------------------
ProgrammingHolic

익명 사용자의 이미지

입력이 개행 문자('\n')로 끝난다는 보장이 있나요?
보통 그럴 거라고 생각하기는 하지만 자동 채점 시스템에 따라 안 그럴 수도 있습니다.

입력이 개행 문자로 끝나지 않을 경우 왜 timeout이 발생하는지 알아내는 건 연습 문제로 남깁니다.

프로그램이 입력을 받을 때에는 코드를 특히 더 방어적으로 작성해야 하는 법이죠.

p.s. 다른 분이 지적하셨듯이, 입력이 최대 100문자까지만 들어온다고 해도 배열을 딱 100칸만 잡으면 버퍼 오버플로우의 소지가 있습니다.

한 바이트의 위력을 무시하지 마세요. 가끔 그 한 바이트로 프로그램이 뚫리기도 합니다.

chanik의 이미지

# '\n'으로 끝날 경우 잘 동작함
$ echo abc | ./a.out
Enter the word : Word Length : 3
Reverse word : cba
 
# '\n'으로 끝나지 않을 경우 오류 발생
$ echo -n abc | ./a.out
Segmentation fault (core dumped)

위 익명님 덧글을 보고 흥미가 생겨 실험해봤습니다. 입력문자열이 짧은 경우라도 \n으로 끝나지 않으면 수천~수만번 scanf()를 반복하다 죽는군요. scanf() 함수의 반환값을 확인하면 이 오류를 피할 수 있을 것입니다.

(segmentation fault에 의한) core dump는 이렇게 발생될 수 있음을 알겠는데, timeout은 왜 나는지 모르겠군요. 아마 채점용 스크립트에서 발생되는 2차 결과인가 싶습니다.