C中strtok的分段错误

问题描述 投票:0回答:1
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;
}

我不知道如何解决这个问题,谢谢您的帮助。

c list segmentation-fault
1个回答
0
投票

我认为这是因为我的str是恒定的。

您为什么这么认为?您的str是not常量:就在这里:

char * s = strdup(s1);

您的代码中有很多错误(实际上令人着迷的是,这么少的代码行中就可以计算出如此多的错误)。

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

© www.soinside.com 2019 - 2024. All rights reserved.