gpt4 book ai didi

c - C段错误的原因

转载 作者:太空宇宙 更新时间:2023-11-04 06:06:12 24 4
gpt4 key购买 nike

在我的程序中,我得到一个seg错误,我不确定原因或如何找出原因。任何帮助都将不胜感激!
在代码中,我试图逐字阅读,但我需要跟踪行号。然后我试图创建一个链接列表,其中的数据是单词和行号。
(有两个文件一起编译)

void main(int argc, char **argv){
file = fopen(argv[1],"r");
struct fileIndex *fIndex = NULL;
delimiters = " .,;:!-";/*strtok chars to seperate*/
int wCount = wordcount(file);/*number of words in file*/
char **str[wCount+1];/*where the lines are being stored*/
int j=0;
while(!feof(file)){/*inserting lines*/
fscanf(file, "%s", &str[j]);
j++;
}

char *token, *cp;
int i;
int len;
for(i = 0; str[i]; i++){/*checking to insert words*/
len = strlen(*str[i]);
cp = xerox(*str[i]);
token = strtok(cp, delimiters);
if(!present(fIndex, token)){
insert(fIndex, i+1,token);
}

while(token!=NULL){
token = strtok(NULL, delimiters);
if(!present(fIndex, token)){
insert(fIndex, i+1,token);
}
}
i++;
}
fclose(file);
}

int strcmpigncase(char *s1, char *s2){/*checks words*/
for(;*s1==*s2;s1++,s2++){
if(*s1=='\0')
return 0;
}
return tolower(*s2)-tolower(*s2);
}

present(struct fileIndex* fIndex, char *findIt){/*finds if word is in structure*/
struct fileIndex* current = fIndex;
while(current!=NULL){
current = current -> next;
if(strcmpigncase(current -> str, findIt)==0){
return current -> lineNum;
}
}
return 0;
}

void insert(struct fileIndex *head, int num, char *insert){/*inserts word into structure*/
struct fileIndex* node = malloc(sizeof(struct fileIndex));

node -> str = insert;
node -> lineNum = num;

node -> next = head;
head = node;
}

#define IN_WORD 1
#define OUT_WORD 0

int wordcount(FILE *input)/*number of words in file*/
{
FILE *open = input;
int cur; /* current character */
int lc=0; /* line count */
int state=OUT_WORD;
while ((cur=fgetc(open))!=EOF) {
if (cur=='\n')
lc++;
if (!isspace(cur) && state == OUT_WORD) {
state=IN_WORD;
}
else if (state==IN_WORD && isspace(cur)) {
state=OUT_WORD;
}
}
return lc;
}

char *xerox(char *s){
int i = strlen(s);
char *buffer = (char *)(malloc(i+1));
if(buffer == NULL)
return NULL;

char *t = buffer;
while(*s!='\0'){
*t=*s;
s++; t++;
}
*t = '\0';
return buffer;
}

最佳答案

这段代码的问题率相当高。我将剖析前几行来给出一个想法:
void main(int argc,char**argv){
main应该返回int,而不是void。可能不是你的问题,但也不对。

file = fopen(argv[1],"r");

在尝试使用 argc之前,您确实需要检查 argv[1]的值。在没有参数的情况下调用程序很可能会导致问题。根据调用它的方式,这可能是问题的原因。
struct fileIndex *fIndex = NULL;

除非您包含了一些尚未显示的标题,否则不应该编译-- struct fileIndex似乎没有定义(也没有在您发布的代码中看到的任何地方定义)。
delimiters = " .,;:!-";/*strtok chars to seperate*/
int wCount = wordcount(file);/*number of words in file*/

此( wordcount)读取到文件的结尾,但不会在之后倒带文件。
char **str[wCount+1];/*where the lines are being stored*/

从你的描述来看,你根本不需要存储行(复数)。您可能需要读取一行,然后将其标记化,并将单个标记(连同行号)插入索引中,然后读取下一行。不过,从你所说的来看,没有真正的理由一次存储多条原始生产线。
int j=0;
while(!feof(file)){/*inserting lines*/

如上所述,您以前已经读到文件的末尾,并且从未重写过该文件。因此,这个循环中的任何内容都不应该执行,因为只要您到达这里, feof(file)就应该返回 true。如果您处理这个问题,这个循环就不能正常工作——事实上, while (!feof(file))形式的循环本质上总是错误的。在这种情况下,您需要检查 fscanf的结果,方法如下:
while (1 == fscanf(file, "%1023s", line))

……因此,当试图读取失败时退出循环。
    fscanf(file, "%s", &str[j]);

这里的内容基本上等同于臭名昭著的 gets——您没有做任何事情来将输入限制为缓冲区的大小。如上所示,您通常希望使用 %[some_number]s,其中 some_number比您正在使用的缓冲区的大小小一个(当然,要做到这一点,您确实需要一个缓冲区,但您也没有这个缓冲区)。
您也没有做任何事情来将行数限制为已分配的空间量(但是,与单独的行一样,您没有分配任何空间)。不过,我几乎不敢提这件事,因为(如上所述)从你的描述来看,你似乎没有任何理由存储多个行。
您的代码还泄漏它分配的所有内存——您有对 malloc的调用,但没有对任何地方的 free的单个调用。
实际上,上面的一些建议(最后或多或少)是错误的。它正在研究如何修复单个代码行,但实际上您可能希望代码的结构总体上有所不同。与其读取文件两次,一次对单词进行计数,然后再次读取该文件对单词进行索引,不如一次读取一行(可能使用 fgets,然后将该行拆分为单词,并在将每个单词插入索引时对其进行计数。哦,而且你几乎肯定也不想使用链接列表作为索引。一棵树或一个哈希表对这项工作来说更有意义。
我也不同意在这段代码上使用调试器的建议。调试器不太可能产生更好的代码——它可能帮助您找到一些本地化问题,但不太可能产生更好的程序。相反,我建议你用一支铅笔和一张纸作为你真正需要使用的工具。我相信您当前的问题主要是因为没有考虑足够的问题来真正理解实现目标所需的步骤,而调试器不太可能有助于找到这个问题的答案。

关于c - C段错误的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10069046/

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