Search code examples
arraysfunctionmallocdynamic-memory-allocationsrand

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


So, I have a code that creates a 7x7 board with Dynamically Allocated Arrays and inside of a board is full with "?" and what I want to do is creating a new function and inside a function, I used rand command to get random numbers like this,

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

Therefore, I had a problem changing 6 random numbers in a board and my Code is below,

This one below is the one I tried to get random numbers for an Array,

    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) = '*';
    }

And this one is where I printed the "?" signs and also where I tried to change 6 different signs and it only prints out "else" part ignoring the "if" for some reason

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

And my whole code is this, it's kinda long but most of them are for a nice looking board

#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");
    }
}

I pointed out important parts that I'm stuck with but still not sure if there is a problem in other parts of my code so I showed it here, just in case.


Solution

  • There are multiple problems in your code:

    • you allocate the 7x7 matrix as a single array of 49 characters. Yet you do not index into this array with the correct formula. The element at position (i,j) is accessed as *(board + 7 * i + j), not *(board + i + j).

      It would be simpler to declare rando and board to point to a 2D matrix and use the [] syntax:

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

      and use board[i][j].

    • Furthermore, the rando array is uninitialized, so the program has undefined behavior when reading the contents of the elements that have not been set to '*' in the first loop. You must initialize this array with '?'. You can do this with memset().

    • the function random() returns an integer in the range 1 to 7 inclusive. You should instead compute pseudo-random coordinates in the range 0 to 6. Remove the +1;

    • the test in the board printing loop is useless: if the board element at position i,j is the same as in the rando matrix you print the rando element otherwise t board element. This always prints the board element.

    Here is a modified version:

    #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;
    }