首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我做错了什么?如何改进我的代码?

我做错了什么?如何改进我的代码?
EN

Stack Overflow用户
提问于 2020-05-08 01:30:12
回答 2查看 82关注 0票数 0

有没有人能解释一下,为什么我按下s键或d键会抛出分割错误,但如果按下s键和w键,它就能正常工作,fine.it只是一个像蛇一样在正方形中移动玩家p的函数。

代码语言:javascript
运行
复制
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;
            }
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2020-05-08 06:12:53

欢迎来到Stack Overflow,欢迎来到编程!

根据相关评论,段错误很可能是由于超出maze[][]数组的界限造成的。你在几条评论中问到你如何处理这种情况。

为了提供最有建设性的建议,而不是给你代码,我将问一个问题:

在编程中,我们如何在特定条件下使某些事情发生或不发生?

因此,请自己描述在哪些情况下不应该引用i + 1j - 1,然后将相应的逻辑添加到代码中。

我也鼓励你问自己:

对于单个输入,我的move() maze[][] 函数要更改多少次maze[][]

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

关于您对此计划的描述,当您:

“按下s按钮或d按钮会抛出分段错误,但使用一个按钮和w按钮,它可以正常工作。”

..。我想说的是,只有当您按下a按钮或w按钮时,它才会显示出工作状态。实际上,无论何时在数组的边界之外引用(无论按下wasd中的哪一个都可能发生),行为都是未定义的。因此,偶然的是,当按下w时,程序编译的方式(对于您来说,在特定的时间)可能不会立即出现段错误。当您在数组的边界之外访问时,您可能会访问可以访问的内存,它看起来会工作;但是您可能会访问您的进程禁止访问的内存,它将会出现segfault。

未定义行为相关的Bugs 可能是最微妙的。逻辑起到保护作用,调试输出语句来显示实际值的变化会有很大帮助。

票数 1
EN

Stack Overflow用户

发布于 2020-05-08 01:41:55

这段代码是不正确的

代码语言:javascript
运行
复制
char choice;

scanf("%s",&choice);

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

这样会更好

代码语言:javascript
运行
复制
char choice[101];

scanf("%100s", choice);

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

101 -与George Orwell无关-允许添加空字符

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

顺便说一句,我还没有读完剩下的代码

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61664053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档