Динамическая память. При выходе из цикла "умирает" первые элемент массива - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Приветствую всех. Долго мучался, как же сформулировать вопрос, и все таки... Есть массив строк(аля char**) в цикле он заполняется(в функцию, где это происходит просто кидают большую строку со '\n'-ами, а в функции в цикле она разбивается на несколько строк). Так вот, в самом цикле все нормально происходит, а вот при выходе на месте первого элемента массива строк красуются несколько(всегда 3) кракозябер, в то время, как с остальными строчками все нормально. Не можете подсказать что либо по этому поводу??
unsigned int menu(unsigned int mask, char* str){
    FILE* flog = fopen("menu.log", "w+");
    char **txt = (char**)malloc(sizeof(char*));
    int i = 0;
    int j = 0;
    do{
        txt[i] = (char*)malloc(32*sizeof(char));
        int k = 0;
        k = snprintf(txt[i], 32, "%d. ", i + 1);
        txt[i] = (char*)realloc(txt[i], (k + 2)*sizeof(char));
        do{
            txt[i][k] = str[j]; fprintf(flog, "  j=%i, k=%i, txt[%i][%i]=%c.\n", j, k, i, k, txt[i][k]);
            txt[i] = (char*)realloc(txt[i], (k + 2)*sizeof(char));
            j++; k++;
        }while(str[j - 1] != '\n');
        txt[i][k] = '\0';
        i++;
    }while(str[j] != '\0');
 
    if(mask < 1 || mask >= (1 << i + 1))
        return 0;
 
    for (int h = 0; h < i; h++)
        fprintf(flog, "txt[%i]=%s\n", h, txt[h]);
    
    int b = 0;
    unsigned int l = 0;
    for(int l = 1; l < (2 << i); l *= 2, b++){
        fprintf(flog, "i=%i, l=%i, (2 << i)=%i, b=%i.\n",i ,l, 2 << i, b);
        if(l & mask){
            printf("%s", txt[b]);
        }
    }
    fclose(flog);
    do{
        printf("Выберите действие(Введите число): ");
        scanf("%i", &l);
    }while(!((mask >> (l - 1)) & 1));
    
    for(int c = 0; c < i; c++)
        free(txt[c]);
    free(txt);
    return l;
}
p. s. string.h низзя.

Решение задачи: «Динамическая память. При выходе из цикла "умирает" первые элемент массива»

textual
Листинг программы
    static char buf[32];
 
    for (int i=0, n=0; str[i]; i+=n+1) {
        sscanf(&str[i], "%32[^\n]%n", buf, &n);
        snprintf(txt[j], 32, "%d. ", buf);
 
    }

Объяснение кода листинга программы

В данном коде используется динамическая память.

  1. Создается статический массив buf типа char размером 32 символа.
  2. В цикле происходит чтение строки str и разделение ее на отдельные элементы (предполагается, что каждый элемент массива buf соответствует одному символу в строке str).
  3. Для каждого элемента массива buf выполняется функция sscanf, которая считывает до 32 символов из строки str и сохраняет их в buf.
  4. Затем выполняется функция snprintf, которая записывает в txt[j] строку в формате номер. текст, где номер — это текущий индекс элемента массива buf, а текст — это содержимое этого элемента.
  5. В конце цикла возвращается значение переменной buf.

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы