все элементы массива одинаковые fgets в C? - PullRequest
0 голосов
/ 15 марта 2019

Так что в настоящее время моя программа использует жестко запрограммированный массив, подобный этому:

char *array[] = {"array","ofran","domle","tters", "squar"}

В основном n строк n длины "n * n сетки. Затем я рассматриваю значения как двумерный массив. Так что ябудет обращаться к массиву [y] [x] и выполнять операции сравнения и математические операции, используя соответствующий ASCII.

Я хотел, чтобы в моей программе были реализованы текстовые файлы различных размеров (n * n) (до 32).вместо жесткого кодирования. Но у меня проблемы с использованием fgets.

Моя текущая функция для получения и хранения информации о файле выглядит так:

char *array[32];
char buffer[32];
FILE *fp = fopen("textfile.txt","r");

int n = 0;
while(fgets(buffer, 32, fp)){
    array[i] = buffer;
    n++;
}
fclose(fp);

, но все значения "массива"одинаковы (они являются последней строкой). Так что с примерами значений выше. Если я напечатал массив [0] в массив [4], я получу

значения из моего кода

squar
squar
squar
squar
squar

ожидаемые значения:

array
ofran
domle
tters
squar

Ответы [ 3 ]

3 голосов
/ 15 марта 2019

array[i] = buffer просто присваивает один и тот же указатель всем элементам array.Здесь необходимо динамическое выделение памяти:

char *array[32];
char buffer[32];
FILE *fp = fopen("textfile.txt","r");

int n = 0;
while(fgets(buffer, 32, fp)){
    array[i] = strdup(buffer);  // allocate memory for a new string
                                // containing a copy of the string in buffer
    n++;
}
fclose(fp);

Для краткости здесь не выполняется проверка ошибок.Кроме того, если входной файл содержит более 32 строк, вы столкнетесь с проблемами.

, если strdup не существует на вашей платформе:

char *strdup(const char *str)
{
  char *newstring = malloc(strlen(str) + 1);  // + 1 for the NUL terminator
  if ( newstring )
    strcpy(newstring, str);
  return(newstring);
}

Снова здесь не выполняется проверка ошибок.для краткости.

3 голосов
/ 15 марта 2019

Учитывая этот код:

char buffer[32];

Сколько существует buffer переменных?

One.

Итак, этот код

array[i] = buffer;

указывает каждый char * элемент array на ONE buffer.

(Одно из исправлений - сделать @Jabberwocky, опубликованный в его ответе - используйте strdup())

0 голосов
/ 15 марта 2019
char *array[32];
char buffer[32];
....    
while(fgets(buffer, 32, fp)){
    array[i] = buffer;
....

Посмотрите на ваши переменные: первая - это массив из 32 символов *, вторая - это массив из 32 символов. В цикле while вы также просто присваиваете каждому элементу массива один и тот же буфер. Ты видишь? В то время как fgets просто обновляет / обновляет этот буфер последними данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...