strtok的。如何完成解析

时间:2015-04-08 13:10:14

标签: c strtok

在页面https://msdn.microsoft.com/en-us/library/2c8d19sb.aspx上有一些文字,我必须先解析之前的字符串才能解析下一个字符串:

  

注意

     

每个函数都使用一个线程局部静态变量来解析   字符串到令牌。因此,多个线程可以同时进行   称这些函数没有不良影响。但是,在一个   单线程,对这些函数之一的交错调用是高度的   可能会产生数据损坏和不准确的结果。解析时   不同的字符串,在开始解析之前完成解析一个字符串   下一个。另外,请注意调用它时可能存在危险   这些函数来自另一个函数所在的循环   调用。如果另一个函数最终使用这些函数之一,则a   将导致交错的调用序列,从而触发数据损坏。

这是什么意思?例如,我只需要第一个令牌。我必须继续致电strtok(null, )完成,或者我可以致电strtok(string2, )吗?

3 个答案:

答案 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)。

此外,如果您只需要一个令牌,可以查看strsepman