我有一个变量,我想将其拆分为一组路径:
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:
有三个"隐式".
元素:在第一个:
之前,在中间两个之间,在最后一个之后。很明显,你通常不会同时拥有这三个,但你需要知道游戏规则。