执行strcpy()函数后程序崩溃

执行strcpy()函数后程序崩溃,c,crash,strcpy,C,Crash,Strcpy,我需要一些帮助来完成一项我必须为学校做的任务,这项任务包括根据书名、作者和出版日期对一些书籍进行分类。所有信息在txt文件中以字符串形式给出,并在它们之间使用分隔符。问题是我无法正确读取数据,我的程序在尝试执行strcpy()后崩溃。你们能帮我一下,告诉我我做错了什么吗 #include <stdio.h> #include <stdlib.h> #include <string.h> struct book { char author[100],t

我需要一些帮助来完成一项我必须为学校做的任务,这项任务包括根据书名、作者和出版日期对一些书籍进行分类。所有信息在txt文件中以字符串形式给出,并在它们之间使用分隔符。问题是我无法正确读取数据,我的程序在尝试执行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;
}

问题在于初始调用
fscanf()
后文件中的换行符仍然存在

这个

读取
5
,随后的
fgets()
只读取
\n
。所以这不是你想要的。使用
fgets()
读取
n
,并使用
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++)

for(i=0;我想知道答案…现在可以了。我终于可以去睡觉了:当调用
fopen()
时,总是检查(!=NULL)返回值以确保操作成功。一般来说,代码不能假设输入文件包含特定数量的行。建议i=0;而(代码中有“魔法”数字。“魔法”数字使代码更难理解、调试和维护。
magic
数字为25150。建议使用#define语句或枚举赋予这些数字有意义的名称,然后在整个代码中使用这些有意义的名称。强烈建议先读取“n”值,然后使用该“n”定义数组中的行数(这“可能”意味着使用
malloc()
而不是定义堆栈上的数组)。始终检查
fgets()
fscanf()
以及
strtok()
中的返回值,以确保操作成功
char str[256];

fgets(str, sizeof str, fp);
sscanf(str, "%d", &n);
for(i=0; i<n; i++)