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차 결과인가 싶습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.