在C中调用strtok之前,正在从字符串中删除子字符串



我有一个变量,我想将其拆分为一组路径:

PATH=/bin:/usr/bin:/usr/local/bin

上面字符串的结果如下:

[0] -> /bin
[1] -> /usr/bin
[2] -> /usr/local/bin

如果我只是在带有分隔符:的字符串上调用strtok,我会得到结果:

[0] -> PATH=/bin
[1] -> /usr/bin
[2] -> /usr/local/bin

但是,我仍然将PATH=作为数组第一个索引处的子字符串。在调用strtok之前,我需要找到从字符串中删除PATH=的方法。

不必在没有PATH=子字符串的情况下重新分配一个新的char数组,我想我可以增加char指针以指向PATH=之后的第一个字符。

char prefix[] = "PATH=";
if (strstr(str, prefix)) {
    str += strlen(prefix);
}

所以现在指针str指向PATH=之后的第一个/。

str += strlen(prefix):之前

PATH=/bin:/usr/bin:/usr/local/bin
↑

str += strlen(prefix):之后

PATH=/bin:/usr/bin:/usr/local/bin
     ↑

我从strtok得到以下路径数组。

[0] -> /bin
[1] -> /usr/bin
[2] -> /usr/local/bin

这在C中会被认为是不好的做法吗?这样做有什么副作用吗?我应该采取另一种方法吗:即分配一个新的缓冲区,并将str的值复制到没有PATH=的新缓冲区中。

第一次使用"="作为分隔符调用strtok(),然后使用":"(和NULL)进行调用。如果需要,您可以将每次调用的分隔符更改为strtok()

当然,这是假设你一开始就不介意strtok()屠杀你的字符串。确保您正在处理PATH变量的副本。

你的建议也很有效。我看到的唯一问题是,如果str是指向动态分配空间开始的唯一指针,那么就不能再释放空间了(内存泄漏)。你需要决定这是否是一个问题——如果是,解决方案很简单:保留一个需要释放的指针副本,这样你就可以释放它

还要注意PATH真的很奇怪:

PATH=:/usr/bin::/bin:

有三个"隐式".元素:在第一个:之前,在中间两个之间,在最后一个之后。很明显,你通常不会同时拥有这三个,但你需要知道游戏规则。

相关内容

  • 没有找到相关文章

最新更新