有人能解释一下为什么如果我按下s按钮或d按钮,它会导致分段错误,但有了按钮和w按钮,它就可以正常工作了。这只是一个像蛇一样在正方形中移动玩家p的功能。
void move(){
int i;
int j;
char choice;
scanf("%s",&choice);
for (i = 0; i < rows; ++i) {
for (j = 0; j < cols; ++j) {
if(maze[i][j] == 'p' && choice == 'a') {
char tmp = maze[i][j];
maze[i][j] = maze[i][j-1];
maze[i][j-1] = tmp;
}
if(maze[i][j] == 'p' && choice == 'w'){
char tmp = maze[i][j];
maze[i][j] = maze[i-1][j];
maze[i-1][j] = tmp;
}
if(maze[i][j] == 'p' && choice == 'd') {
char tmp = maze[i][j];
maze[i][j] = maze[i][j+1];
maze[i][j+1] = tmp;
}
if(maze[i][j] == 'p' && choice == 's') {
char tmp = maze[i][j];
maze[i][j] = maze[i+1][j];
maze[i+1][j] = tmp;
}
}
}
}
欢迎使用Stack Overflow,欢迎使用编程!
根据相关评论,segfault很可能是由于超出了maze[][]
数组的界限。你在几条评论中询问如何应对这种情况。
为了提供最具建设性的建议,而不是给你代码,我要问一个问题:
在编程中,我们如何在特定条件下导致某些事情发生或不发生
因此,请自己描述在哪些条件下应该而不是进行i + 1
或j - 1
之类的引用,然后将相应的逻辑添加到代码中。
我也鼓励你问问自己:
我的move()
函数为单个输入更改maze[][]
多少次
写下你的答案,然后在move()
中循环的最内部添加输出语句,或者例如一个打印出maze[][]
的总当前状态的show()
函数。看看你的预期答案是否与你的实际输出相匹配。
关于您对该程序的描述,当您:
"按下s按钮或d按钮,它会引发分段故障,但有了一个按钮和w按钮,它就可以正常工作">
。。。我想说,当您按下a
按钮或w
按钮时,只有才显示工作。事实上,每当引用超出数组的边界时(无论按下w
、a
、s
或d
中的哪一个都可能发生这种情况(,行为都是未定义。因此,碰巧的是,当按下w
时,程序的编译方式(对您来说,在特定时间(可能不会立即出错。当您在数组的边界之外进行访问时,您可能会访问可以访问的内存,并且似乎可以工作;但是,您可能会访问进程禁止访问的内存,这将导致segfault。
与未定义行为相关的Bug可能是最难处理的。充当护栏的逻辑,以及显示实际值更改的调试输出语句,可以起到很大的帮助。
马上这个代码是不正确的
char choice;
scanf("%s",&choice);
选择是一个字符-它怎么能容纳多个字符的字符串?
这将是更好的
char choice[101];
scanf("%100s", choice);
将启用最多100个字符的字符串
101-与乔治·奥威尔无关-允许添加空字符
您还应该检查scanf
的返回值。请阅读scanf
的手册页面
BTW-我还没有阅读代码的其余部分