Итак, в настоящее время моя программа использует такой жестко закодированный массив:
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
используйте strcpy вместо назначения строки.
@aragon используйте strcpy вместо назначения строки Нет. Не делай этого. Указатели в array относятся к константным строковым литералам фиксированной длины, возможно, доступным только для чтения.





Учитывая этот код:
char buffer[32];
Сколько buffer переменных существует?
Один.
Итак, этот код
array[i] = buffer;
указывает каждый char * элемент array на ОДИНbuffer.
(Одно из решений — сделать @Jabberwocky опубликованным в его ответе — используйте strdup())
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);
}
Опять же, для краткости проверка ошибок здесь не проводится.
Теперь вы пропустили утверждение return. Один из тех дней? :-)
char *array[32];
char buffer[32];
....
while(fgets(buffer, 32, fp)){
array[i] = buffer;
....
Посмотрите на свои переменные: первая представляет собой массив из 32 указателей char*, вторая представляет собой массив из 32 символов. В цикле while вы также просто назначаете каждый элемент массива одному и тому же буферу. Ты видишь? В то время как fgets просто продолжает обновлять/обновлять этот буфер последними данными.
array[i] = buffer;просто присваивает один и тот же указатель всем элементамarray. Здесь вам нужно динамическое выделение памяти или, может быть, двумерный массивchar.