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