c-我做错了什么,如何改进我的代码

  • 本文关键字:何改进 代码 错了 c move
  • 更新时间 :
  • 英文 :


有人能解释一下为什么如果我按下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 + 1j - 1之类的引用,然后将相应的逻辑添加到代码中。

我也鼓励你问问自己:

我的move()函数为单个输入更改maze[][]多少次

写下你的答案,然后在move()中循环的最内部添加输出语句,或者例如一个打印出maze[][]的总当前状态的show()函数。看看你的预期答案是否与你的实际输出相匹配。


关于您对该程序的描述,当您:

"按下s按钮或d按钮,它会引发分段故障,但有了一个按钮和w按钮,它就可以正常工作">

。。。我想说,当您按下a按钮或w按钮时,只有才显示工作。事实上,每当引用超出数组的边界时(无论按下wasd中的哪一个都可能发生这种情况(,行为都是未定义。因此,碰巧的是,当按下w时,程序的编译方式(对您来说,在特定时间(可能不会立即出错。当您在数组的边界之外进行访问时,您可能会访问可以访问的内存,并且似乎可以工作;但是,您可能会访问进程禁止访问的内存,这将导致segfault。

未定义行为相关的Bug可能是最难处理的。充当护栏的逻辑,以及显示实际值更改的调试输出语句,可以起到很大的帮助。

马上这个代码是不正确的

char choice;
scanf("%s",&choice);

选择是一个字符-它怎么能容纳多个字符的字符串?

这将是更好的

char choice[101];
scanf("%100s", choice);

将启用最多100个字符的字符串

101-与乔治·奥威尔无关-允许添加空字符

您还应该检查scanf的返回值。请阅读scanf的手册页面

BTW-我还没有阅读代码的其余部分

相关内容

  • 没有找到相关文章

最新更新