Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中strtok上的Segfault_C_List_Segmentation Fault - Fatal编程技术网

C中strtok上的Segfault

C中strtok上的Segfault,c,list,segmentation-fault,C,List,Segmentation Fault,我正在编写一个字符串链列表,我需要标记我的文本。 我的所有函数都单独工作,但在construire\u list()函数中,我得到一个segfault。 我想这是因为我的str是恒定的。 Chain new_Chain(){return NULL;} 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;}

typedef struct S_Linear_Chain *Chain;

struct S_Linear_Chain
{
    char mot[20];
    int occ;
    Chain next;
};
我不知道如何解决这个问题,谢谢你的帮助

我想这是因为我的str是恒定的

你为什么这么想?你的str不是常数:它就在这里:

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;
}
您的is代码中有很多bug(在这么少的代码行中就可以计算出这么多bug,这实际上很有趣)

  • 调用
    strdup
    是不必要的:您可以同样轻松地标记
    s1
  • strdup
    返回的内存泄漏
  • 调用strtok将找到第一个令牌。该行的其余部分将保持未标记状态(您必须反复调用
    strtok
    ,以标记整个行)
  • 您应该删除
    fgets
    将读取的尾部
    \n
  • 由于stroken从不更新,因此
    while
    循环将永远运行,直到耗尽所有内存(这可能是崩溃的原因)
  • 由于忽略了inseredbut的返回值,因此此处也会泄漏内存。代码最有可能是:
    l=inseredbut(l,stroken)
  • 在插入的
    中,这一行:
    new->occ++增加未初始化值(未定义
    new->occ
    的初始值)
  • 请学习

    我想这是因为我的str是恒定的

    你为什么这么想?你的str不是常数:它就在这里:

    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;
    }
    
    您的is代码中有很多bug(在这么少的代码行中就可以计算出这么多bug,这实际上很有趣)

  • 调用
    strdup
    是不必要的:您可以同样轻松地标记
    s1
  • strdup
    返回的内存泄漏
  • 调用strtok将找到第一个令牌。该行的其余部分将保持未标记状态(您必须反复调用
    strtok
    ,以标记整个行)
  • 您应该删除
    fgets
    将读取的尾部
    \n
  • 由于stroken从不更新,因此
    while
    循环将永远运行,直到耗尽所有内存(这可能是崩溃的原因)
  • 由于忽略了inseredbut的返回值,因此此处也会泄漏内存。代码最有可能是:
    l=inseredbut(l,stroken)
  • 在插入的
    中,这一行:
    new->occ++增加未初始化值(未定义
    new->occ
    的初始值)

  • 请学习。

    (a)提供一个。(b) 当
    new->occ++在插入的
    中执行,但
    new->occ
    未分配值。您只调用strtok一次。您需要为每个令牌调用它。更重要的是,您需要学习如何使用调试器
    由于数组指针
    s1
    未设置为指向有效字符串,因此对
    strdup()
    的调用将停止将字符数组指针复制到by
    s1
    strdup()
    在哪里会遇到NUL字节?没有人真正知道。结果是未定义的行为。请更正:
    while(strToken!=NULL){insereDebut(l,strToken);}
    这无法更新
    strToken
    ,因此将始终指向字符串的同一部分。建议:
    while(strToken!=NULL){insereDebut(l,strToken);strToken=strtok(NULL,分隔符);}
    (a)提供一个。(b) 当
    new->occ++在插入的
    中执行,但
    new->occ
    未分配值。您只调用strtok一次。您需要为每个令牌调用它。更重要的是,您需要学习如何使用调试器
    由于数组指针
    s1
    未设置为指向有效字符串,因此对
    strdup()
    的调用将停止将字符数组指针复制到by
    s1
    strdup()
    在哪里会遇到NUL字节?没有人真正知道。结果是未定义的行为。请更正:
    while(strToken!=NULL){insereDebut(l,strToken);}
    这无法更新
    strToken
    ,因此将始终指向字符串的同一部分。建议:
    while(strToken!=NULL){insereDebut(l,strToken);strToken=strtok(NULL,separators);}
    我纠正了所有问题,但我总是得到一个segfault。。请看我的答案below@ZouitineMehdi您没有纠正所有问题(例如,换行符处理仍然缺失)。你不应该提供“答案”,而应该编辑你的问题,并提供一个“我纠正了所有要点,但我总是得到一个错误”。。请看我的答案below@ZouitineMehdi您没有纠正所有问题(例如,换行符处理仍然缺失)。不要提供“答案”,你应该编辑你的问题,并提供答案