1
Example Text: 

bclk = /gsrpkg_te/gsrpkg/gsrdie/xxBCLK

我想问关于“strtok”的问题。下面是一个示例代码,我遇到了一些疑问。

char *p4;
char *p5;
p4 = strtok (eqvline, "=");
p5 = strtok (NULL, ":");
if ( !strcmp (p4, "bclk") ) {
   strcpy ( sa_de_bclk, p5 );
   printf ( "[vTPSim] ---> bclk = %s.\n", p5);
}

从上面的示例文本中,任何地方都没有":"(冒号)。对于我的理解,strtok()当没有找到定义的符号时,将分配 NULL 作为结果。

但是,为什么在这种情况下即使没有":"p5仍然有 的分配"/gsrpkg_te/gsrpkg/gsrdie/xxBCLK"

感谢您的帮助。

4

3 回答 3

5

对于我对 strtok 的理解,当没有找到定义的符号时,将分配 NULL 作为结果

也许您strtok()strchr()or感到困惑strstr()。如果在字符串的剩余部分中没有找到任何分隔符,则strtok()返回剩余部分(更准确地说,是指向其第一个字符的指针)。如果根本找不到分隔符,它可能是整个字符串。文档。

从文档中引用仇恨者和否认者:

如果没有找到这样的字节,则当前标记延伸到s1 指向的字符串的末尾,随后对标记的搜索将返回一个空指针。

随后的。不是立即找不到更多定界符的调用,而是紧随其后的调用

于 2013-07-16T08:18:53.910 回答
3

如果第一个参数为 NULL,则 strtok 尝试获取下一个令牌。由于第一个 strtok 调用strtok (eqvline, "=")eqvline != NULLtoken =第二个调用将在您的示例中找到下一部分,即/gsrpkg_te/gsrpkg/gsrdie/xxBCLK

于 2013-07-16T08:20:36.767 回答
0

也许您应该阅读 strtok http://www.cplusplus.com/reference/cstring/strtok/的文档。

char * strtok ( char * str, const char * delimiters );

对该函数的一系列调用将 str 拆分为标记,这些标记是由作为定界符一部分的任何字符分隔的连续字符序列。

在第一次调用时,该函数需要一个 C 字符串作为 str 的参数,其第一个字符用作扫描标记的起始位置。在随后的调用中,该函数需要一个空指针,并使用最后一个标记结束后的位置作为新的扫描起始位置。

当我查看您的示例时,我希望 p4 包含“bclk”而不是“bclk”,因为您没有将空格定义为分隔符。根据文档,您在第 4 行 (p5 = ...) 所做的操作没有定义的结果,因为您更改了对 strtok 的调用之间的分隔符。我希望它使用第一个分隔符,因此在“=”之后返回字符串的其余部分。它能做什么...

希望这可以帮助

于 2013-07-16T08:28:50.040 回答