执行 strcpy() 函数后程序崩溃
Program crashes after perfoming strcpy() function
我需要一些帮助来完成我必须为学校做的作业,其中包括根据书名、作者和出版日期对一些书进行分类。所有信息都在 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;
}
输入示例可以是这样的:
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
问题出在初始 fscanf()
调用后文件中留下的换行符。
这个
fscanf(fp,"%d",&n);
读取 5
,随后的 fgets()
只读取 \n
。所以这不是你想要的。使用 fgets()
读取 n
并使用 sscanf()
或 strto*
将其转换为整数。例如,除了调用 fscanf()
,您还可以这样做:
char str[256];
fgets(str, sizeof str, fp);
sscanf(str, "%d", &n);
从文件中读取 n
。
您还应该检查 strtok()
returns 是否为 NULL。如果你这样做了,你就会很容易地找出问题所在。
此外,您需要从 0
到 n-1
。所以for
循环中的条件是错误的。应该是
for(i=0; i<n; i++)
我需要一些帮助来完成我必须为学校做的作业,其中包括根据书名、作者和出版日期对一些书进行分类。所有信息都在 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;
}
输入示例可以是这样的:
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
问题出在初始 fscanf()
调用后文件中留下的换行符。
这个
fscanf(fp,"%d",&n);
读取 5
,随后的 fgets()
只读取 \n
。所以这不是你想要的。使用 fgets()
读取 n
并使用 sscanf()
或 strto*
将其转换为整数。例如,除了调用 fscanf()
,您还可以这样做:
char str[256];
fgets(str, sizeof str, fp);
sscanf(str, "%d", &n);
从文件中读取 n
。
您还应该检查 strtok()
returns 是否为 NULL。如果你这样做了,你就会很容易地找出问题所在。
此外,您需要从 0
到 n-1
。所以for
循环中的条件是错误的。应该是
for(i=0; i<n; i++)