【发布时间】:2016-10-31 01:39:19
【问题描述】:
我是 C 的初学者,请不要抨击我。 所以,我有这个函数可以获取“ip/mask”类型的字符串的掩码:
char *getmask(char n[]) {
char x[255] = { 0 };
strcpy(x, n);
char *mask;
mask = strtok(x, "/");
mask = strtok(NULL, "/");
return mask;
}
问题是我需要在一个字符串中的多个“ip/mask”上执行此操作。所以当我这样做时:
net = strtok(x4, " ");
net = strtok(NULL, " ");
while (net != NULL) {
net = strtok(NULL, " ");
strcpy(masca, "\n");
strcpy(masca, getmask(net));
//some other code
}
问题是 strtok() 出现故障,因为我在此期间首先调用它,但随后在 getmask(net) 中再次调用它。
无论如何要绕过它?如果没有,我还能如何拆分字符串?
【问题讨论】:
-
你是从
net=strtok(NULL," ")开始的吗?问题描述令人困惑。显示具有输入和输出的最小程序。 -
对不起,第一个 strtok 在 while 之前。我会编辑
-
strtok作为状态机运行,因此每个调用都带有状态。为了拆分一系列以空格分隔的标记和/分隔的标记的子集,您需要防止状态发生冲突。这可以通过迭代两次来完成,或者如@Ludonope 所述 -
@Aaron3468 所以我猜我不能使用 getmask 函数,而是我可以先 strtok(NULL," ") , strtok(NULL,"/") 获取 ip 然后strtok(NULL,"/") 再次返回掩码?
-
基本上一旦你调用
strtok,它就会在你分配给它的最后一个字符串上继续,直到它到达那个字符串的末尾。所以在你完成第一个字符串之前,你不能“喂”它新的字符串。在中途开始一个新字符串是不安全的,因为strtok会将 NULL 字符添加到原始字符串中。有更好的选择;strtok_r是最明显的,但您也可以使用strpbrk之类的函数来实现相同的行为(但需要更多工作)。