2017-04-17 5 views
-2

이 코드를 디버깅하려고했지만 지금은 정말 도움이 필요합니다. 매우 귀하의 문제가 스택 오버 플로우되어단순 경로 찾기에서의 세그먼트 오류 코드

#include <stdio.h> 

char grid[5][5] = { 
    {'t', 'z', 'x', 'c', 'd'}, 
    {'a', 'h', 'n', 'z', 'x'}, 
    {'h', 'w', 'o', 'i', 'o'}, 
    {'o', 'r', 'n', 'r', 'n'}, 
    {'a', 'b', 'r', 'i', 'n'}, 
}; 
int n = 5; 
int found = 0; // flag indicating if string has been found 


void find(int i, int j, char *search) { 
    if (i >= n || j >= n || i < 0 || j < 0) { 
     return ; 
    } 

    if (!search) { 
     found = 1; 
     return ; 
    } 

    if (grid[i][j] == search[0]) { 

     find (i+1, j, search+1); 
     find (i, j+1, search+1); 
     find (i+1, j+1, search+1); 
     find (i-1, j, search+1); 
     find (i, j-1, search+1); 
     find (i-1, j-1, search+1); 
    } 
    else { 
     find (i+1, j, search); 
     find (i, j+1, search); 
     find (i+1, j+1, search); 
     find (i-1, j, search); 
     find (i, j-1, search); 
     find (i-1, j-1, search); 
    } 
} 


int main() { 
    char s[] = {'h', 'o', 'r', 'i', 'z', 'o', 'n', '\0'}; // String to be searched 
    find(0, 0, s); 
    printf("%s\n", found ? "Found": "Not Found");  
    return 0; 
} 
+0

, 나는 당신의 재귀가 또 다시 같은을 평가하고 확신합니다. 동적 프로그래밍을 사용하여이 문제에 접근하십시오. –

+0

또한'(grid [I] [j] == search [0])'의'else'가 틀린 것 같습니다. 연속 경로를 찾는 경우 문자가 일치하지 않으면 이웃을 검색하지 않아야합니다. –

+0

코드가 실행되는 모든 단계를 분석하지 않았습니다. 그러나 사용하기 전에 '검색'의 범위를 확인해야한다고 생각합니다. 희망이있다 도움이 되길 바랍니다 –

답변

1

구현상의 문제는 재귀를 제대로 작성하지 않았다는 것입니다. 연속 경로 검색의 경우 문자가 일치하지 않으면 이웃을 보지 않아야합니다.

또한 실수로 문자열을 완성하면 search이 NULL이 될 것으로 예상됩니다. 사실 search[0] =='\0'인지 확인해야합니다.

이웃을 보지 않으려면 (다른 사람을 제거하여) 모든 시작점을 살펴야합니다.

다음 코드를 고려하십시오.

#include <stdio.h> 

char grid[5][5] = { 
    {'t', 'z', 'x', 'c', 'd'}, 
    {'a', 'h', 'n', 'z', 'x'}, 
    {'h', 'w', 'o', 'i', 'o'}, 
    {'o', 'r', 'n', 'r', 'n'}, 
    {'a', 'b', 'r', 'i', 'n'}, 
}; 
int n = 5; 
int found = 0; // flag indicating if string has been found 
void find(int i, int j, char *search) { 
    if (i >= n || j >= n || i < 0 || j < 0) { 
     return ; 
    } 

    if (search[0]=='\0') { 
     found = 1; 
     return ; 
    } 

    if (grid[i][j] == search[0]) { 
     find (i+1, j, search+1); 
     find (i, j+1, search+1); 
     find (i+1, j+1, search+1); 
     find (i-1, j, search+1); 
     find (i, j-1, search+1); 
     find (i-1, j-1, search+1); 
    } 
} 


int main() { 
    char s[] = {'h', 'o', 'r', 'i', 'z', 'o', 'n', '\0'}; // String to be searched 
    int i, j; 
    for(i = 0; i<n && !found;i++) 
     for(j = 0; j<n && !found;j++){ 
      find(i, j, s); 
     } 
    printf("%s\n", found ? "Found": "Not Found");  
    return 0; 
} 

올바르게 작동하고 Found을 인쇄합니다. 여기

데모 : 당신은 어떤 값을 캐시 할 필요가 https://ideone.com/l3ohwr

+0

감사합니다. 예상대로 작업하십시오. – Aakash

3

주시면 감사하겠습니다 분할 fault.Any 포인터를 그리드에 문자열을 찾는하지만 몇 가지 이유로 인해에 내가 갖는 코드입니다. 당신은 디버거에서 프로그램을 실행하면

,이 같은 것을 볼 것이다 : 인덱스가 반복되는 것을

Program received signal SIGSEGV, Segmentation fault. 
0x00000000004006d5 in find (i=3, j=4, search=0x7fffffffdd44 "zon") at t.c:34 
34   find (i+1, j, search); 
(gdb) bt 10 
#0 0x00000000004006d5 in find (i=3, j=4, search=0x7fffffffdd44 "zon") at t.c:34 
#1 0x0000000000400720 in find (i=4, j=4, search=0x7fffffffdd44 "zon") at t.c:37 
#2 0x00000000004006da in find (i=3, j=4, search=0x7fffffffdd44 "zon") at t.c:34 
#3 0x0000000000400720 in find (i=4, j=4, search=0x7fffffffdd44 "zon") at t.c:37 
#4 0x00000000004006da in find (i=3, j=4, search=0x7fffffffdd44 "zon") at t.c:34 
#5 0x0000000000400720 in find (i=4, j=4, search=0x7fffffffdd44 "zon") at t.c:37 
#6 0x00000000004006da in find (i=3, j=4, search=0x7fffffffdd44 "zon") at t.c:34 
#7 0x0000000000400720 in find (i=4, j=4, search=0x7fffffffdd44 "zon") at t.c:37 
#8 0x00000000004006da in find (i=3, j=4, search=0x7fffffffdd44 "zon") at t.c:34 
#9 0x0000000000400720 in find (i=4, j=4, search=0x7fffffffdd44 "zon") at t.c:37 
#10 0x00000000004006da in find (i=3, j=4, search=0x7fffffffdd44 "zon") at t.c:34 
(More stack frames follow...) 

공지 사항을, 당신은 앞으로 진전이되지 않습니다. 또한이 :

(gdb) bt -10 
#261985 0x0000000000400720 in find (i=4, j=4, search=0x7fffffffdd44 "zon") at t.c:37 
#261986 0x0000000000400651 in find (i=4, j=3, search=0x7fffffffdd43 "izon") at t.c:27 
#261987 0x0000000000400651 in find (i=4, j=2, search=0x7fffffffdd42 "rizon") at t.c:27 
#261988 0x00000000004006f0 in find (i=4, j=1, search=0x7fffffffdd42 "rizon") at t.c:35 
#261989 0x00000000004006f0 in find (i=4, j=0, search=0x7fffffffdd42 "rizon") at t.c:35 
#261990 0x0000000000400637 in find (i=3, j=0, search=0x7fffffffdd41 "orizon") at t.c:26 
#261991 0x0000000000400637 in find (i=2, j=0, search=0x7fffffffdd40 "horizon") at t.c:26 
#261992 0x00000000004006da in find (i=1, j=0, search=0x7fffffffdd40 "horizon") at t.c:34 
#261993 0x00000000004006da in find (i=0, j=0, search=0x7fffffffdd40 "horizon") at t.c:34 
#261994 0x000000000040079f in main() at t.c:46 

프로그램이 스택 고갈로 추락하기 전에, 그것은 (재귀)를 호출 find 260,000+ 번에 관리 있음을 알려줍니다.