gpt4 book ai didi

c - C 中的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 05:58:10 25 4
gpt4 key购买 nike

此程序将按字母顺序从文本创建链接列表。
它区分大小写,并且会消除标记。

当我运行程序时,它给出了一个段错误。我找不到问题出在哪里。我添加了 printf() 以找出错误,但我做不到。

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

typedef struct NODE {
char *word;
int count;
struct NODE *next;
}NODE;

char *get_word(FILE *fp){
printf("getWord");
char *str = (char*)malloc(sizeof(char)*100);

char c;
do {
c = fgetc(fp);
if (c == EOF)
return 0;
} while (!isalpha(c));
do {
printf("getWord");

*str++ = tolower(c);
c = fgetc(fp);
printf("Word");

} while (isalpha(c));

return str;
}

void insert(NODE* sortedList, char *word) {
printf("INSERT ");

char *str = (char*)malloc(sizeof(char)*100);
if (sortedList == NULL || word < sortedList->word) {

NODE *ekle;
ekle=(NODE*)malloc(sizeof(NODE));
strcpy(ekle->word,word);
ekle->count = 1;
ekle->next = sortedList;
sortedList = ekle;
}
else {
//
NODE *current = sortedList->next;
NODE *pre = sortedList;
while (current != NULL && word > current->word) {
pre = current;
current = current->next;
}
if (current != NULL && word == current->word) {

(current->count)++;
}
else {

NODE *ekle;
ekle=(NODE*)malloc(sizeof(NODE));
strcpy(ekle->word,word);
ekle->count = 1;
ekle->next = current;
pre->next = ekle;
}
}
}

void createList(FILE* fp,NODE *n) {
printf("CREATELIST ");
char *word;
strcpy(word,get_word(fp));
puts(word);
while (strcmp(word,"")) {
printf("Create_LİST2");
insert(n,word);
word = get_word(fp);
}
}

NODE *head;


int main(){
NODE *list=NULL;;
FILE *fp;
fp=fopen( "text.txt", "r" );
head=list;

while(!feof(fp)){

createList(fp,list);

}
while(list->next != NULL){
printf("%s", list->word);
}
return 0;
}

最佳答案

主要问题是这条线

*str++ = tolower(c);

这会更改指针 str,因此当您从函数返回 str 时,它实际上指向 字符串之外。顺便说一句,您不终止的字符串。

另一个主要问题是这些行:

NODE *ekle;
ekle=(NODE*)malloc(sizeof(NODE));
strcpy(ekle->word,word);

这里分配了一个NODE结构,但是没有为ekle->word分配内存,所以指向的是不确定的内存。你在两个地方有上面的代码。

等于上面的分配问题,你有

char *word;
strcpy(word,get_word(fp));

在这里你也没有为 word 分配内存,所以你有一个指向不确定内存的指针。


此外,在 C 中 you should not cast the return of malloc .您还应该注意来自编译器的警告,如果您没有从您的代码中得到任何警告,那么您需要启用更多警告。编译器警告通常是 undefined behavior 的标志这就是以上所有的结果。最后,除了编译器,我认为调试器是开发人员的最佳工具。学习使用它,它会帮助您解决上述一些问题。

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

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