Как занести данные из двумерного массива в структуру

Вот код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 100

typedef struct words {
  char *mas;
}words;


int main()
{
    words *words_in=malloc(sizeof(words));
    //system("clear");
    int num_str = 0; //количество строк
    int k = 0;
    int sup = 0;
    int words = 0; // количество слов в тексте
    int sym = 0; // количество символов в тексте
    char str[LEN]; // 
    char arr[LEN][LEN]; // 
    char* istr;
    words_in->mas=malloc(sizeof(char)*sizeof(arr));
    //char *istr1;

    FILE* fp = fopen("test", "r");
    while (!feof(fp)) {
        if (fgetc(fp) == '\n')
            num_str++;
    }
    fclose(fp); 

    fp = fopen("test", "r");
    printf("\nТекст файла\n\n");
    for (int i = 0; i < num_str; i++) { 
        istr = fgets(str, LEN, fp);
        printf("%s", istr);
        for (char* istr = strtok(str, " .\t\n"); istr; istr = strtok(NULL, " .\t\n")) {
            strcpy(arr[k++], istr);
        }
    }
    fclose(fp);

    fp = fopen("test", "r");
    printf("\nПодсчет количества слов в тексте\n\n");
    for (int i = 0; i < num_str; i++) {
        istr = fgets(str, LEN, fp);
        printf("%s", istr);
        for (char* istr = strtok(str, " \t\n"); istr; istr = strtok(NULL, " .\t\n")) {
            strcpy(arr[k++], istr);
            words++;
        }
    }
    fclose(fp);

    printf("\nКоличество слов в тексте = %d\n", words);
    printf("\nНахождение одинаковых слов\n\n");
    for (int i = 0; i < words; i++) {
        sup = 0;
        for (int j = i + 1; j < words; j++) {
            if (strcmp(arr[i], arr[j]) == 0) {
                sup++;
                printf("%s==%s, %d\n", arr[i], arr[j], sup);
            }
        }
    }
    //fclose(fp);

    printf("\nПодсчет количества символов в тексте\n");
    fp = fopen("test", "r");
    while (fgetc(fp) != EOF) {
        sym++;
    }
    printf("\nКоличество символов в тексте = %d\n", sym - 1);
    fclose(fp);
    return 0;
}

Тут я сканирую текст из файла, разбиваю по словам, заношу слова в двумерный массив arr[LEN][LEN]. Но как мне выделить динамически память для arr и занести слова из этого массива в стуктуру?


Ответы (1 шт):

Автор решения: Harry

Я бы на вашем месте ограничился одномерным массивом

char ** arr = malloc(words*sizeof(char*));

А дальше просто вносил бы в него слова с помощью strdup -

arr[j] = strdup(найденное слово);

Если же вы хотите работать, не зная заранее количества слов - то тогда нужно сначала сделать небольшой массив и записывать слова, следя за границами массива. Исчерпался - вызываем realloc, добавляя память, и работаем дальше.

Добавлять лучше не по одному элементу, а, например, удваивая имеющийся объем - так будет эффективнее.

→ Ссылка