Как назначить случайную строку для 2D-массива - PullRequest
0 голосов
/ 15 апреля 2020

Программа читает файл, который содержит одно слово в каждой строке. После чтения случайного слова поместите случайное слово в указатель и верните указатель. В основной функции printf ("% s", fun c ("example.txt ", str)) он печатает другую строку при запуске программы. Я хочу сделать это в 2d массиве (20 * 20), как таблица, но я не представляю, как это сделать. Когда я печатаю функцию во внутренней l oop, это дает мне одно и то же слово на каждом шаге l oop.

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

char *word(char *file, char *str);

int main() {
    char *str ;
    int i, j;

    str = (char *)malloc(20);
    srand(time(NULL));
    char *puzzle[20][20];

    for (i = 0; i < 20; i++) {
        for (j = 0; j < 20; j++) {
            puzzle[i][j] = word("words.txt", str);
        }
    }

    for (i = 0; i < 20; i++) {
        for (j = 0; j < 20; j++) {
            printf("%s     ", puzzle[i][j]);
        }

        printf("\n");
    }
}

char *word(char *file, char *str) {
    int end, loop, line;


    FILE *fd = fopen(file, "r");

    if (fd == NULL) {
        printf("Failed to open file\n");
        return (NULL);
    }

    srand(time(NULL));
    line = rand() % 100 + 1;

    for (end = loop = 0; loop < line; ++loop) {
        if (0 == fgets(str, 20, fd)) {
            end = 1;
            break;
        }
    }

    if (!end)
        return (char *)str;

    fclose(fd);
    free(str);
}

1 Ответ

1 голос
/ 15 апреля 2020

У меня нет вашего words.txt файла, поэтому я создал несколько случайных строк ниже.

И примечание:

  • Поскольку ваш вложенный l oop в main ваш код открывает файл в подфункции и возвращает его без закрытия; затем возвращается к подпрограмме и снова открывается, и снова, и снова ... Всегда лучше сразу прочитать и закрыть файл перед возвратом из подпрограммы.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char **word(int countString, int maxChars) {
    int i;
    int j;
    int k;
    // allocate memory for pointers that are pointing to each string
    char **arrStr = malloc(countString * sizeof(char *));

    // srand(time(NULL));

    for (i = 0; i < countString; i++) {
        // create a random string with a length of 'k'
        // say, 5 <= k <= maxChars
        // that (+ 1) is for the string terminating character '\0'
        k = (rand() % (maxChars - 5)) + 5 + 1;
        // allocate memory for string
        arrStr[i] = malloc(k * sizeof(char));

        for (j = 0; j < k - 1; j++) {
            *(arrStr[i] + j) = rand() % 26 + 'A';
        }

        *(arrStr[i] + j) = '\0';
    }

    return arrStr;
}

int main() {
    int countString = 10;
    int maxChars = 20;
    char **arrStr = NULL;
    int i;

    arrStr = word(countString, maxChars);

    for (i = 0; i < 10; i++) {
        printf("%s\n", *(arrStr + i));
    }

    // do not forget to free the strings
    // and then the string pointers (array)

    return 0;
}
...