在 C 中的 strtok 上的 Segfault


typedef struct S_Linear_Chain *Chain;
struct S_Linear_Chain
{
char mot[20];
int occ;
Chain next;
};

我正在编写一个字符串链列表,我需要标记我的文本。 我所有的函数都单独工作,但在construire_list()函数中我得到一个段错误。 我想这是因为我的str是恒定的。 链 new_Chain(( { 返回 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);

你的代码中有很多错误(实际上很有趣,这么多错误可以在这么少的代码行中计算出来(。

  1. 调用strdup是不必要的:您可以轻松地标记s1
  2. strdup返回的内存已泄漏。
  3. strtok的调用将找到第一个令牌。该行的其余部分将保持未标记化(您必须反复调用strtok以标记整行(。
  4. 您应该删除fgets将读取的尾随n
  5. 由于strToken永远不会更新,因此您的while循环将永远运行,直到您耗尽所有内存(这可能是崩溃的原因(。
  6. 由于您忽略了insereDebut的返回值,因此此处也会泄漏内存。代码很可能是:l = insereDebut(l,strToken);
  7. insereDebut中,此行:new->occ++;递增未初始化的值(new->occ的初始值未定义(。

请学习如何调试小程序。

相关内容

  • 没有找到相关文章

最新更新