typedef struct S_Linear_Chain *Chain;
struct S_Linear_Chain
{
char mot[20];
int occ;
Chain next;
};
我正在编写字符串链列表,我需要标记我的文本。
我所有的函数都是单独工作的,但是在construire\u list()函数中,我得到了一个segfault。
我想是因为我的str是恒定的。
Chain new_Chain(){return NULL;}
Chain insereDebut(Chain deb,char* c)
{
Chain new = malloc(sizeof(struct S_Linear_Chain));
strcpy(new->mot,c);
new->next = deb;
new->occ++;
return new;
}
Chain construire_list()
{
char s1[MAX];
Chain l = new_Chain();
fgets(s1, MAX, stdin);
char * s = strdup(s1);
const char * separators = " ";
char * strToken = strtok (s, separators );
while ( strToken != NULL ) {
insereDebut(l,strToken);
}
return l;
}
我不知道怎么解决这个问题,谢谢你的帮助
最佳答案
我想是因为我的str是恒定的。
你为什么这么想?你的str不是恒定的:就在这里:
char * s = strdup(s1);
在你的is代码中有很多错误(在这么少的代码行中可以计算出这么多错误,这真的很有趣)。
调用
strdup
是不必要的:您可以同样轻松地标记s1
。strdup
返回的内存泄漏。调用
strtok
将找到第一个令牌。该行的其余部分将保持不变(您必须反复调用strtok
来标记整行)。您应该删除
\n
将读取的尾部fgets
。由于
strToken
从未更新,因此您的while
循环将永远运行,直到耗尽所有内存(这可能是导致崩溃的原因)。由于忽略了
insereDebut
的返回值,因此也会在此处泄漏内存。代码很可能是:l = insereDebut(l,strToken);
在
insereDebut
中,此行:new->occ++;
增加未初始化的值(未定义new->occ
的初始值)。请学习how to debug small programs。
关于c - 在C中的strtok上出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58352950/