当我在下一个代码部分使用strtok时,我会收到分段故障核心。代码正在调试,但是当我运行它时,我得到了分段错误。我该如何解决?
struct{ char *name;
void(*func)(void);
}cmd[]={
{"read_cm",read_cm},
{"NA",NULL}
};
int d;
char *s="_\n";
char *token2;
for(d=0;cmd[d].func!=NULL;d++)
{
token2=strtok((cmd[d].name),s);
}
答案 0 :(得分:3)
您不能修改字符串文字。任何修改字符串文字的尝试都会导致未定义的行为。
标准C函数strtok
尝试在将字符串拆分为子字符串时插入终止零。
要解决此问题,请使用字符数组而不是指针name
。或者动态分配内存并将字符串复制到指针name
指向的已分配内存。
例如
struct
{
char name[8];
void(*func)(void);
} cmd[] =
{
{ "read_cm", read_cm },
{ "NA", NULL }
};
另一种方法是使用标准C函数strcspn
和strspn
代替strtok
来查找子字符串。