有没有人能解释一下,为什么我按下s键或d键会抛出分割错误,但如果按下s键和w键,它就能正常工作,fine.it只是一个像蛇一样在正方形中移动玩家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;
}
}
}
}
发布于 2020-05-08 06:12:53
欢迎来到Stack Overflow,欢迎来到编程!
根据相关评论,段错误很可能是由于超出maze[][]
数组的界限造成的。你在几条评论中问到你如何处理这种情况。
为了提供最有建设性的建议,而不是给你代码,我将问一个问题:
在编程中,我们如何在特定条件下使某些事情发生或不发生?
因此,请自己描述在哪些情况下不应该引用i + 1
或j - 1
,然后将相应的逻辑添加到代码中。
我也鼓励你问自己:
对于单个输入,我的move()
maze[][]
函数要更改多少次maze[][]
?
写下您的答案,然后在move()
中的循环的最内层添加输出语句,或者例如打印出maze[][]
的当前总状态的show()
函数。看看你的预期答案是否与你的实际输出相符。
关于您对此计划的描述,当您:
“按下s按钮或d按钮会抛出分段错误,但使用一个按钮和w按钮,它可以正常工作。”
..。我想说的是,只有当您按下a
按钮或w
按钮时,它才会显示出工作状态。实际上,无论何时在数组的边界之外引用(无论按下w
、a
、s
或d
中的哪一个都可能发生),行为都是未定义的。因此,偶然的是,当按下w
时,程序编译的方式(对于您来说,在特定的时间)可能不会立即出现段错误。当您在数组的边界之外访问时,您可能会访问可以访问的内存,它看起来会工作;但是您可能会访问您的进程禁止访问的内存,它将会出现segfault。
与未定义行为相关的Bugs 可能是最微妙的。逻辑起到保护作用,调试输出语句来显示实际值的变化会有很大帮助。
发布于 2020-05-08 01:41:55
这段代码是不正确的
char choice;
scanf("%s",&choice);
选项是一个字符-它怎么能容纳多个字符的字符串呢?
这样会更好
char choice[101];
scanf("%100s", choice);
将启用最多100个字符的字符串
101 -与George Orwell无关-允许添加空字符
您还应该检查scanf
的返回值。请阅读scanf
的手册页面
顺便说一句,我还没有读完剩下的代码
https://stackoverflow.com/questions/61664053
复制相似问题