c언어 관련질문입니다.
글쓴이: sky1020 / 작성시간: 목, 2020/10/15 - 11:44오후
이 코드가 문자열을 뒤집는 코드인데 실행했을때는 잘 되는데 테스트 케이스나 제출하니까 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; }
Forums:
일단 실행은 안해 봤습니다. 그냥 눈으로만 코드를
일단 실행은 안해 봤습니다. 그냥 눈으로만 코드를 읽었을 때 바로 보이는 문제는 arr 배열보다 큰 입력이 들어오면 버퍼 오버 플로우입니다.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
답변 감사합니다만
답변 감사합니다만 입력받는 word가 크기가 1~100으로 고정되어 있습니다. 다른 문제는 없을까요??
rev_arr[101] = {0}
rev_arr[101]
일지도요. 안돌려봐서 결과는 모르겠습니다.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
timeout 에러네요
timeout 이면 '\n' 이 입력 되기전에 나빌레라 님 말처럼 버퍼를 넘어갔겠네요
while 문의 조건에 size 조건을 추가하시면 되겠네요
그리고 while {} 문을 do { } while 로 바꾸면 scanf 를 한번만 써도 되겠군요
------------------------------------------------------------
ProgrammingHolic
입력이 개행 문자('\n')로 끝난다는 보장이 있나요
입력이 개행 문자(
'\n'
)로 끝난다는 보장이 있나요?보통 그럴 거라고 생각하기는 하지만 자동 채점 시스템에 따라 안 그럴 수도 있습니다.
입력이 개행 문자로 끝나지 않을 경우 왜 timeout이 발생하는지 알아내는 건 연습 문제로 남깁니다.
프로그램이 입력을 받을 때에는 코드를 특히 더 방어적으로 작성해야 하는 법이죠.
p.s. 다른 분이 지적하셨듯이, 입력이 최대 100문자까지만 들어온다고 해도 배열을 딱 100칸만 잡으면 버퍼 오버플로우의 소지가 있습니다.
한 바이트의 위력을 무시하지 마세요. 가끔 그 한 바이트로 프로그램이 뚫리기도 합니다.
# '\n'으로 끝날 경우 잘 동작함
위 익명님 덧글을 보고 흥미가 생겨 실험해봤습니다. 입력문자열이 짧은 경우라도 \n으로 끝나지 않으면 수천~수만번 scanf()를 반복하다 죽는군요. scanf() 함수의 반환값을 확인하면 이 오류를 피할 수 있을 것입니다.
(segmentation fault에 의한) core dump는 이렇게 발생될 수 있음을 알겠는데, timeout은 왜 나는지 모르겠군요. 아마 채점용 스크립트에서 발생되는 2차 결과인가 싶습니다.
댓글 달기