在页面https://msdn.microsoft.com/en-us/library/2c8d19sb.aspx上有一些文字,我必须先解析之前的字符串才能解析下一个字符串:
注意
每个函数都使用一个线程局部静态变量来解析 字符串到令牌。因此,多个线程可以同时进行 称这些函数没有不良影响。但是,在一个 单线程,对这些函数之一的交错调用是高度的 可能会产生数据损坏和不准确的结果。解析时 不同的字符串,在开始解析之前完成解析一个字符串 下一个。另外,请注意调用它时可能存在危险 这些函数来自另一个函数所在的循环 调用。如果另一个函数最终使用这些函数之一,则a 将导致交错的调用序列,从而触发数据损坏。
这是什么意思?例如,我只需要第一个令牌。我必须继续致电strtok(null, )
完成,或者我可以致电strtok(string2, )
吗?
答案 0 :(得分:1)
我必须继续调用strtok(null,)来完成或者我可以调用 的strtok(字符串2,)?
如果您只需要第一个令牌获取它并继续使用它,则无需在获取第一个令牌后调用strtok(NULL,"<delimiter>")
。由于strtok()使用内部状态,并且如果您希望将相同的字符串分成多个标记,那么您需要在第一次传递实际字符串后传递NULL
。
初始通话应为
strtok(string2,"<delimiter>");
答案 1 :(得分:1)
如果您正在使用不同线程之间没有连续strtok
调用的程序,您可以根据需要获取第一个令牌,然后继续在其他字符串上使用strtok
而不会出现问题。
答案 2 :(得分:0)
NULL
必须在第二个及以上使用,string2
将开始一个新序列。如果您只需要第一个令牌,只需调用一次。
请参阅man strtok。
如果您有更多线程致电strtok
,则最后一次致电strtok
获胜,使前一次无效(使用strtok_r
)。
此外,如果您只需要一个令牌,可以查看strsep
(man)