2015-12-06 5 views
0

Мне нужна помощь с назначением, которое я должен сделать для школы, которая заключается в сортировке некоторых книг после названия, автора и даты публикации. Вся информация указана в виде строки в 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 
+0

при вызове 'fopen()' always check (! = NULL) возвращаемое значение для обеспечения успешной операции. – user3629249

+0

в целом, код не может считать, что входной файл содержит определенное количество строк. Предложите i = 0; while (i <25 && fgets (intro [i], sizeof (intro [i]), fp)) 'поэтому цикл управляется максимальным количеством итераций и успешно считывает строку из файла. – user3629249

+0

В коде есть «магические» номера. «магические» номера делают код более сложным для понимания, отладки, поддержки. «Магические» цифры - 25, 150. Предложите либо использование операторов #define, либо перечисление, чтобы присвоить эти числа значимым именам, а затем использовать эти значащие имена для всего кода. – user3629249

ответ

0

Проблема с новой строки остается в файле после первоначального fscanf() вызова.

Этот

fscanf(fp,"%d",&n); 

читает 5 и последующее fgets() читает только \n. Так что это не то, что вы хотите. Прочитайте n с использованием fgets() и преобразуйте его в целое число с использованием sscanf() или strto*. Например, вместо fscanf() вызова, вы можете сделать:

char str[256]; 

fgets(str, sizeof str, fp); 
sscanf(str, "%d", &n); 

читать n из файла.

Вы также должны проверить, возвращается ли strtok() NULL. Если бы вы это сделали, вы бы легко поняли проблему.

Кроме того, вам необходимо перейти от 0 к n-1. Таким образом, условие в цикле for неверно. Он должен быть

for(i=0; i<n; i++) 
+0

Спасибо за ответ ... он работает сейчас , Я могу наконец поспать: D –

+0

Ха-ха. Удачи! –

Смежные вопросы