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
,以标记整个行)fgets
将读取的尾部\n
while
循环将永远运行,直到耗尽所有内存(这可能是崩溃的原因)l=inseredbut(l,stroken)代码>
中,这一行:new->occ++代码>增加未初始化值(未定义new->occ
的初始值)
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
,以标记整个行)fgets
将读取的尾部\n
while
循环将永远运行,直到耗尽所有内存(这可能是崩溃的原因)l=inseredbut(l,stroken)代码>
中,这一行:new->occ++代码>增加未初始化值(未定义new->occ
的初始值)
请学习。(a)提供一个。(b) 当
new->occ++代码>在插入的中执行,但new->occ
未分配值。您只调用strtok一次。您需要为每个令牌调用它。更重要的是,您需要学习如何使用调试器
由于数组指针s1
未设置为指向有效字符串,因此对strdup()
的调用将停止将字符数组指针复制到bys1
。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()
的调用将停止将字符数组指针复制到bys1
。strdup()
在哪里会遇到NUL字节?没有人真正知道。结果是未定义的行为。请更正:while(strToken!=NULL){insereDebut(l,strToken);}
这无法更新strToken
,因此将始终指向字符串的同一部分。建议:while(strToken!=NULL){insereDebut(l,strToken);strToken=strtok(NULL,separators);}
我纠正了所有问题,但我总是得到一个segfault。。请看我的答案below@ZouitineMehdi您没有纠正所有问题(例如,换行符处理仍然缺失)。你不应该提供“答案”,而应该编辑你的问题,并提供一个“我纠正了所有要点,但我总是得到一个错误”。。请看我的答案below@ZouitineMehdi您没有纠正所有问题(例如,换行符处理仍然缺失)。不要提供“答案”,你应该编辑你的问题,并提供答案