在用动态分配数组制作的板上用 SRAND 改变 6 个不同的随机数

Changing 6 different random numbers with SRAND in a board made with Dynamically Allocated Arrays

所以,我有一个代码可以创建一个 7x7 boardDynamically Allocated Arrays 并且 board 内部充满了 "?" 我想做的是创建一个新函数,在函数内部,我使用 rand 命令 来获取这样的随机数,

int random() {
    return ((rand() % 7) + 1);
}

因此,我在更改板上的 6 个随机数时遇到了问题,我的代码如下,

下面这个是我尝试获取数组随机数的那个,

    printf("Enter number: ");
    scanf("%d", &b);
    char *rando = (char *)malloc(7 * 7 * sizeof(char));
    for (i = 0; i < b; i++) {
        rand1 = random();
        rand2 = random();
        *(rando + rand1 + rand2) = '*';
    }

这一个是 我打印“?”的地方signs 以及我尝试更改 6 个不同 signs 的地方,它只打印出 "else" 部分,忽略了 "if" 出于某种原因

        for (j = 0; j < 7; j++) {
            if (*(board + i + j) == *(rando + i + j))
                printf("| %c ", *(rando + i + j));
            else
                printf("| %c ", *(board + i + j));
            }

我的整个代码是这样的,它有点长,但大部分都是为了一个漂亮的板子

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

int random() {
    return ((rand() % 7) + 1);
}

int main() {
    int i, j, k, rand1, rand2, b;
    srand(time(NULL));
    printf("Enter number: ");
    scanf("%d", &b);
    char *rando = (char *)malloc(7 * 7 * sizeof(char));
    for (i = 0; i < b; i++) {
        rand1 = random();
        rand2 = random();
        *(rando + rand1 + rand2) = '*';
    }
    char *board = (char *)malloc(7 * 7 * sizeof(char));
    for (i = 0; i < 7; i++) {
        for (j = 0; j < 7; j++) {
            *(board + i + j) = '?';
        }
    }
    for (i = 1; i <= 7; i++) {
        printf("%4d", i);
    }
    printf("\n  ");
    for (i = 0; i < 7; i++) {
        printf("+---");
    }
    printf("+\n");
    for (i = 0; i < 7; i++) {
        printf("%d ",i);
        for (j = 0; j < 7; j++) {
            if (*(board + i + j) == *(rando + i + j))
                printf("| %c ", *(rando + i + j));
            else
                printf("| %c ", *(board + i + j));
        }
        printf("|\n");
        for (k = 0; k <= 7; k++) 
            if (k == 0)
                printf("  ");
            else
                printf("+---");
        printf("+\n");
    }
}

我指出了我一直坚持的重要部分,但仍然不确定我的代码的其他部分是否存在问题,所以我在这里展示了它,以防万一.

您的代码中存在多个问题:

  • 您将 7x7 矩阵分配为 49 个字符的单个数组。但是您没有使用正确的公式对该数组进行索引。位置 (i,j) 的元素被访问为 *(board + 7 * i + j),而不是 *(board + i + j).

    声明 randoboard 指向二维矩阵并使用 [] 语法会更简单:

    char (*board)[7] = malloc(7 * sizeof(*board));
    

    并使用 board[i][j].

  • 此外,rando数组是未初始化的,所以程序在第一次循环中读取未设置为'*'的元素的内容时有未定义的行为.您必须使用 '?' 初始化此数组。您可以使用 memset().

  • 函数 random() returns 17 范围内的整数(含)。您应该改为计算 06 范围内的伪随机坐标。删除 +1;

  • 电路板打印循环中的测试没有用:如果位置 ij 的电路板元素与 rando 矩阵中的相同打印 rando 元素,否则打印板元素。这总是打印板元素。

这是修改后的版本:

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

int random(void) {
    return rand() % 7;
}

void init_board(char board[7][7]) {
    // board can be initialized with 2 nested loops or
    // a single call to
    //memset(board, '?', 7 * 7);
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 7; j++) {
            board[i][j] = '?';
        }
    }
}

void print_board(char board[7][7]) {
    for (int i = 0; i < 7; i++) {
        printf("%4d", i + 1);
    }
    printf("\n  ");
    for (int i = 0; i < 7; i++) {
        printf("+---");
    }
    printf("+\n");
    for (int i = 0; i < 7; i++) {
        printf("%d ", i + 1);
        for (int j = 0; j < 7; j++) {
            printf("| %c ", board[i][j]);
        }
        printf("|\n");
        printf("  ");
        for (int j = 0; j < 7; j++) {
            printf("+---");
        }
        printf("+\n");
    }
}

int main() {
    int b;

    srand(time(NULL));
    printf("Enter number: ");
    scanf("%d", &b);
    char (*rando)[7] = malloc(7 * sizeof(*rando));
    if (!rando)
        return 1;
    init_board(rando);
    for (int i = 0; i < b; i++) {
        int rand1 = random();
        int rand2 = random();
        rando[rand1][rand2] = '*';
    }
    char (*board)[7] = malloc(7 * sizeof(*board));
    if (!board)
        return 1;
    init_board(board);

    /* print the mines */
    print_board(rando);

    /* print the board */
    print_board(board);

    free(rando);
    free(board);
    return 0;
}