gpt4 book ai didi

c - 为什么我的 C 代码出现段错误?

转载 作者:行者123 更新时间:2023-11-30 20:54:57 24 4
gpt4 key购买 nike

我正在尝试从文件中读取一行并返回它,并且只要到达 EOF 或最后一行,我就想迭代调用此函数。这是代码。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define BUFF 100000

int grep_stream(FILE* fpntr, char* string, char* filepathname);
char* get_next_line(FILE* fpntr);
int main()
{
FILE* fp;
fp = fopen("movies.txt", "r");
char* filename = "test";
char* searchString = "the";
grep_stream(fp, searchString, filename);
return 0;
}
int grep_stream(FILE* fpntr, char* string, char* filepathname)
{

char* tmp = get_next_line(fpntr);
char* ret;
while(tmp != NULL)
{
ret = strstr(tmp, string);
printf("%s\n", ret);
tmp = get_next_line(fpntr);
}
return 0;
}

char* get_next_line(FILE* fpntr)
{
char buff[BUFF];
int index = 0;
int ch = fgetc(fpntr);
while(ch != '\n' && ch != EOF)
{
buff[index++] = ch;
ch = fgetc(fpntr);
}
buff[index] = '\0';
char* tmp;
/*I am not freeing this tmp, will that be a problem if I call this function iteratively*/
tmp = (char*)malloc((int)(index)*sizeof(char));
strcpy(tmp, buff);
return tmp;
}

在 main 中,我将使用有效参数调用 grep_stream() 函数。

更新:我试图添加的文件是这样的:http://textuploader.com/5ntjm

最佳答案

ret = strstr(tmp, string);
printf("%s\n", ret);

这里的ret有可能是NuLL吗?也许您的意思是 printf("%s\n", ret ? ret : "NO MATCH");

#define BUFF 100000
char buff[BUFF];

这是一个巨大数组。可能会导致堆栈溢出吗?

char buff[BUFF];
int index = 0;
int ch = fgetc(fpntr);
while(ch != '\n' && ch != EOF)
{
buff[index++] = ch;
ch = fgetc(fpntr);
}

如果用户输入的行太长,buff 数组将会溢出。您是否考虑过为该循环设置上限?

tmp = (char*)malloc((int)(index)*sizeof(char));
strcpy(tmp, buff);

这里进行了太多的转换(应该没有),malloc 接受 size_t (不是 int)并且 sizeof char 始终为 1。在这一点上,index 当然应该是 size_t

字符串在末尾占用一个额外的字符'\0'。您未能为该附加字符分配空间,因此 strcpy 将溢出缓冲区。

不要忘记检查malloc的返回值。您可能想写:

tmp = malloc(index + 1);
if (tmp == NULL) {
return NULL;
}
strcpy(tmp, buff);

malloc的返回值类似,您需要检查fopen的返回值:

fp = fopen("movies.txt", "r");
if (fp == NULL) {
puts("Error opening movies.txt");
exit(EXIT_FAILURE);
}

最后一点,您 malloc 的所有内容都应该free。您当前的算法泄漏了大量内存。如果您的文件足够大,这可能会导致您的程序崩溃。

关于c - 为什么我的 C 代码出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36002432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com