Мне нужна помощь с назначением, которое я должен сделать для школы, которая заключается в сортировке некоторых книг после названия, автора и даты публикации. Вся информация указана в виде строки в txt-файле, используя разделитель между ними. Проблема в том, что мне не удается должным образом прочитать данные, моя программа вылетает после попытки выполнить команду strcpy(). Можете ли вы, ребята, помочь мне с этим и сказать мне, что я сделал неправильно?Сбой программы после выполнения функции strcpy()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct book
{
char author[100],title[100];
int year;
};
int main()
{
struct book b[25];
int i,n;
char intro[25][150],*p;
const char delim[2] = "#";
FILE *fp;
fp=fopen("text.txt", "r");
fscanf(fp,"%d",&n);
for(i=0;i<=n;i++)
{
fgets(intro[i], sizeof (intro[i]), fp);
p=strtok(intro[i], delim);
strcpy(b[i].title,p);
p=strtok(NULL, delim);
strcpy(b[i].author,p); /// The program works until it reaches this point - after performing this strcpy() it crashes
if(p!=NULL)
{
p=strtok(NULL,delim);
b[i].year=atoi(p);
}
}
return 0;
}
Пример ввода может быть такой:
5
Lord Of The Rings#JRR Tolkien#2003
Emotional Intelligence#Daniel Goleman#1977
Harry Potter#JK Rowling#1997
The Foundation#Isaac Asimov#1952
Dune#Frank Herbert#1965
при вызове 'fopen()' always check (! = NULL) возвращаемое значение для обеспечения успешной операции. – user3629249
в целом, код не может считать, что входной файл содержит определенное количество строк. Предложите i = 0; while (i <25 && fgets (intro [i], sizeof (intro [i]), fp)) 'поэтому цикл управляется максимальным количеством итераций и успешно считывает строку из файла. – user3629249
В коде есть «магические» номера. «магические» номера делают код более сложным для понимания, отладки, поддержки. «Магические» цифры - 25, 150. Предложите либо использование операторов #define, либо перечисление, чтобы присвоить эти числа значимым именам, а затем использовать эти значащие имена для всего кода. – user3629249