C: Чтение в файле строк в массив char * s

У меня есть что-то вроде этого (без проблем с интервалом), где я читаю файл со строками, которые разделены знаком # и пытается прочитать каждый из них в массив char * s. Тем не менее, каждый char* который содержит строку, представляет собой точную длину строки. Это немного плохо.

 char * fragments[1000]; char temp[20]; while (i < numFrags) { if (fscanf(fp, "#%15[^#]#", temp) == 1) { char entry[strlen(temp)]; entry = strcpy(entry, temp); fragments[i++] = entry; printf("%d\n", strlen(temp)); } } 

Мысли?

Ваша проблема заключается в том, что вы повторно используете массив записей.

Посмотрите, как для всех i у нас есть fragments[i++] = entry; , В конце концов, каждый fragment будет указывать на одно и то же место и, следовательно, будет содержать одну и ту же строку (в этом случае она будет последней прочитанной строкой).

Кажется, что вы пытались обойти это, используя как temp и массив fscanf , но в конце вы могли бы так же fscanf записать fscanf в массив fscanf .


Другой проблемой, которую вы можете получить, является то, что ваши указатели указывают на массив, который автоматически выделяется в стеке (например: массив, объявленный внутри функции). Эти ячейки памяти повторно используются вашей программой после того, как ваша функция вернется, ваши указатели могут начать указывать на недопустимые данные (и поскольку это C, использование этих поврежденных строк может привести к разным сбоям и плохому поведению программы).


Проблема в основном связана с проблемой распределения памяти, поэтому существует множество решений.

  1. Сделать fragments массивом массивов символов (а не только указателей). Таким образом, у вас есть безопасная память для каждой строки.

     char fragments[2000][20]; //can hold 2000 19-character strings for(i=0; i 

    Преимущество этого решения заключается в том, что он прост и что вся память выделяется заранее.

  2. Используйте динамическое распределение памяти с помощью malloc . Это позволяет вам выбрать другой размер массива для каждой строки, а также позволяет выбирать размер ваших массивов во время выполнения, а не время компиляции.

     char* fragments[2000]; char entry[MAX_FRAGMENT_LENGTH]; //temporary buffer for strings for(i=0; i 

    Основным преимуществом этого метода является то, что он очень гибкий, хотя и достаточно прост. Основное отличие заключается в том, что вам нужно будет free все указатели, которые были malloc -ed после того, как вы закончите с ними (иначе вы можете получить утечку памяти).

  3. Сделайте «динамическое распределение» вручную, используя один большой буфер, чтобы содержать все строки.

     char buffer[2000*20]; char* fragments[2000]; char* next_empty_location = buffer; for(i=0; i 

    Если вы не можете / не хотите / не разрешаете использовать решение malloc , это то, что подходит ближе всего. Это может быть труднее понять (в случае, если у вас проблемы с C), но именно тот, который лучше всего подходит, соответствует неопределенному «каждому символу», который содержит строку, которая будет строго ограничена строкой.