Динамическая память. При выходе из цикла "умирает" первые элемент массива - C (СИ)
Формулировка задачи:
Приветствую всех. Долго мучался, как же сформулировать вопрос, и все таки...
Есть массив строк(аля char**) в цикле он заполняется(в функцию, где это происходит просто кидают большую строку со '\n'-ами, а в функции в цикле она разбивается на несколько строк). Так вот, в самом цикле все нормально происходит, а вот при выходе на месте первого элемента массива строк красуются несколько(всегда 3) кракозябер, в то время, как с остальными строчками все нормально. Не можете подсказать что либо по этому поводу??
p. s. string.h низзя.
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; }
Решение задачи: «Динамическая память. При выходе из цикла "умирает" первые элемент массива»
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); }
Объяснение кода листинга программы
В данном коде используется динамическая память.
- Создается статический массив buf типа char размером 32 символа.
- В цикле происходит чтение строки str и разделение ее на отдельные элементы (предполагается, что каждый элемент массива buf соответствует одному символу в строке str).
- Для каждого элемента массива buf выполняется функция sscanf, которая считывает до 32 символов из строки str и сохраняет их в buf.
- Затем выполняется функция snprintf, которая записывает в txt[j] строку в формате
номер. текст
, где номер — это текущий индекс элемента массива buf, а текст — это содержимое этого элемента. - В конце цикла возвращается значение переменной buf.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д