Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
输入C程序后,继续获取seg故障_C_File_Segmentation Fault - Fatal编程技术网

输入C程序后,继续获取seg故障

输入C程序后,继续获取seg故障,c,file,segmentation-fault,C,File,Segmentation Fault,我在我的C程序中遇到了一个错误,输入后它会出现seg错误,但我不确定错误在哪里。假设该程序为电影列表动态分配内存,并能够添加和搜索到列表中。我不确定出了什么问题,我想这和我的缓冲有关 程序接受movies.txt文件内容的命令行参数: 五, 不可能的任务 行动 4. 2008 向上的 行动 3. 2012年 用户输入电影名称以按名称或分级搜索或显示电影 #包括 #包括 #包括 //极限定义 #定义限制100 //电影结构 结构电影 { 字符名[100]; 字符类型[30]; 国际评级; 国际发布

我在我的C程序中遇到了一个错误,输入后它会出现seg错误,但我不确定错误在哪里。假设该程序为电影列表动态分配内存,并能够添加和搜索到列表中。我不确定出了什么问题,我想这和我的缓冲有关

程序接受movies.txt文件内容的命令行参数:

五, 不可能的任务 行动 4. 2008 向上的 行动 3. 2012年

用户输入电影名称以按名称或分级搜索或显示电影

#包括
#包括
#包括
//极限定义
#定义限制100
//电影结构
结构电影
{
字符名[100];
字符类型[30];
国际评级;
国际发布日期;
};
//读取文件
void readFile(文件*fp,结构电影*movieList[],int*noOfReviews)
{
字符缓冲区[100];
int计数器=0;
结构电影*新节点;
FGET(缓冲区、限制、fp);
*noOfReviews=atoi(buffer);//缓冲区中的评论数
printf(“%d”,*noOfReviews);//打印评论
while((fgets(buffer,LIMIT,fp)!=NULL)| |(*noOfReviews>0))//如果为NULL或大于零
{
如果(计数器%4==0)
{
struct movie*tmpNode=(struct movie*)malloc(sizeof(struct movie));//分配内存
movieList[计数器]=tmpNode;
newNode=tmpNode;
*noOfReviews——;//——#of reviews
}
//拷贝被串入缓冲区
开关(计数器%4)
{
案例0:
strcpy(newNode->name,buffer);
打破
案例1:
strcpy(newNode->type,buffer);
打破
案例2:
newNode->rating=atoi(缓冲区);
打破
案例3:
newNode->releaseDate=atoi(缓冲区);
打破
违约:
printf(“例外情况”);
打破
}
计数器++;
}
}
//搜索列表
int searchList(struct movie*movielist[],char movieName[],int noOfMovies)
{
int计数器=0;
而(noOfMovies--)
{
if(strcmp(movielist[counter]->name,movieName)==0)//如果字符串与name比较
{
返回计数器;
}
计数器++;
}
返回-1;
}
//比较名称的字符串
int nameStrCmp(常量无效*a,常量无效*b)
{
返回(strcmp(((结构电影*)a)->名称,((结构电影*)b)->名称);
}
//比较分级字符串
内部评级STRCMP(常数无效*a,常数无效*b)
{
返回(((结构电影*)a)->评级-((结构电影*)b)->评级;
}
//显示结构
无效显示(结构电影*电影列表[],int n)
{
int i;
结构电影*searchRslt;
对于(i=0;iname,searchRslt->type,searchRslt->rating,searchRslt->releaseDate);
}
}
//主要功能
int main(int argc,char*argv[])
{
字符缓冲区[100];
国际努弗雷维酒店;
struct movie*movieList[1000];
结构电影*searchRslt;
char-mName[100];
if(argc name,searchRslt->type,searchRslt->rating,searchRslt->releaseDate);
}
打破
案例2:
qsort(movieList、noOfReviews、sizeof(struct movie)、nameStrCmp);
显示(电影列表、视频视图);
打破
案例3:
qsort(电影列表、noOfReviews、sizeof(结构电影)、ratingStrCmp);
显示(电影列表、视频视图);
打破
违约:
打破
}
}
}

在代码中的不同位置可能会发生不同位置的缓冲区溢出。您的代码中充满了硬编码大小的数组,通常不清楚访问这些数组的所有代码是否都遵守了大小限制。尽量避免使用硬编码大小的数组,而是动态分配这些数组。如果您真的想在某些地方使用硬编码数组大小,请使用某种类型的“size”常量,并尝试通过在代码中使用整洁的结构来确保遵守该常量,如写入“name”的函数,该函数永远不会超过names size等

当“type”的输入行(包括行尾)超过29个字符时,程序很容易崩溃。这是因为您使用
strcpy
将读取行
buffer
(最多可包含99个字符)复制到
newNode->type
(最多可包含29个字符)中,而strcpy可能会写过缓冲区的末尾(缓冲区溢出)


另一种使程序崩溃的方法是将1000多条电影记录传递给它。

您是否尝试过通过GDB之类的调试器运行程序,以查看分段错误发生的位置?我尝试在mac笔记本电脑上安装GDB调试器,因为我不在我的电脑上(linux),但似乎无法正确安装它,它只是不断更新自制软件,或者只是给我错误,我甚至还按照教程来证明我的钥匙链和东西,因此我在这里问。你的程序调用的参数是什么?参数文件的内容是什么?用户输入的是什么?@HeLLo我在
readFile()
的switch语句中编辑了问题。您会感到惊讶:
案例0:strcpy(newNode->name,buffer);printf(“缓冲区:“%s”\n”,缓冲区);printf(“名称:“%s”\n”,newNode->name);中断