【发布时间】:2017-09-12 18:02:24
【问题描述】:
我一直在尝试调试此代码,但现在确实需要帮助。这是在网格中查找字符串的代码,但由于某种原因,我遇到了分段错误。任何指针都将受到高度赞赏
#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;
}
【问题讨论】:
-
我没有分析你的代码将运行的每一步。但我认为你应该在使用之前检查“搜索”的范围。希望对你有帮助
-
使用c++编码时,检查数组的每个范围是一个好习惯
-
如果“检查范围”是指索引在
grid范围内,那么他确实 这样做了。 -
您需要缓存一些值,我相信您的递归会一次又一次地评估相同的值。尝试使用动态编程来解决这个问题。
-
另外
(grid[I][j] == search[0])的else似乎不正确。如果您正在寻找一条连续的路径,则如果字符不匹配,则不应尝试搜索邻居。
标签: c debugging path segmentation-fault backtracking