c - 为什么编写这个程序会输出奇怪的字符串?

标签 c

我正在尝试用 C 语言编写扫雷程序。我首先将值分配给二维数组,然后打印它。我尝试了一切,但没有成功。

这发生在我的示例输出中:

代码是:

#include <stdio.h>
#include <stdlib.h>

struct Tile {
    unsigned char isMine : 1;
    char status;
};

int main() {
    struct Tile arr[9][9];
    unsigned char i;
    unsigned char c;
    unsigned char count = 10;
    srand((unsigned)time(0));
    for (i = 0; i < 9; i++) {
        for (c = 0; i < 9; i++) {
            if(rand() % 81 + 1 < count && arr[i][c].isMine == 0 && count > 0) {
                arr[i][c].isMine = 1;
                arr[i][c].status = 'X';
                count--;
            } else if (arr[i][c].isMine == 0) {
                arr[i][c].status = '.';
            }
        }
        if (count == 0) {
            break;
        } else {
            continue;
        }
    }
    for (i = 0; i < 9; i++) {
        for (c = 0; c < 9; c++) {
            printf("%c", arr[i][c].status);
        }
        printf("\n");
    }
    return 0;
}

请帮忙。

最佳答案

由于循环标题不正确,您永远不会访问循环中除第一列之外的任何字段:

    for (i = 0; i < 9; i++) {
        for (c = 0; i < 9; i++) {
            if(rand() % 81 + 1 < count && arr[i][c].isMine == 0 && count > 0) {
                arr[i][c].isMine = 1;
                arr[i][c].status = 'X';
                count--;
            } else if (arr[i][c].isMine == 0) {
                arr[i][c].status = '.';
            }
        }
        if (count == 0) {
            break;
        } else {
            continue;
        }
    }

这将使所有其他字段未初始化,当您尝试打印它时,可能会出现奇怪的事情。

此外,由于您只访问每个字段一次(或者至少这似乎是您的意图),因此无需检查 isMine根本不。如果初始化正确的话,无论如何它一定是0。

这当然要求您正确初始化,正如大卫的回答中已经提到的那样。

条件可以稍微减少一点,因为第一部分 ( ..+1<count ) 已经暗示 count>0 。无需再次检查。

最后,continue因为循环的最后一条指令并不是很有用。

您的代码可能如下所示:

    struct Tile arr[9][9] = {{0}};;
...
    for (i = 0; i < 9; i++) {
        for (c = 0; c < 9; c++) {
            if(rand() % 81 + 1 < count) {
                arr[i][c].isMine = 1;
                arr[i][c].status = 'X';
                count--;
            } else {
                arr[i][c].status = '.';
            }
        }
        if (count == 0) {
            break;
        }
    }

关于c - 为什么编写这个程序会输出奇怪的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64338507/

相关文章:

c++ - char* 和 char arr[] 区别 - C++/C

c - 简单的 HTTP 客户端 c recv() block

c - 我正在尝试在我的 C 程序登录中应用 do while 循环,但我不明白

c - 如何重新启动双链表?

c - 在没有 stdio.h 的情况下从 c 中的文本中删除特定行

c - 我怎样才能让 swig 包装一个链表类型的结构?

c - 负数的 GNU Flex 正则表达式

c - 简单计算器无法按预期工作 - 初学者帮助 (C)

c - 快板蛇游戏

c - pset 3 - 恢复 - 代码仅输出一个图像并退出调试 50