C语言Strtok()函数

2025 年 9 月 5 日 | 阅读 5 分钟

在C编程语言中,strtok()方法主要用于根据指定的界定符将字符串分解成令牌或更小的字符串。为了获取所有令牌,应该在循环中调用strtok()方法,当没有剩余令牌时,它会返回NULL。strtok()方法的声明在string.h头文件中。

strtok()函数的语法

它具有以下语法:

在这个语法中,

  • s: 它表示指向需要被标记化的字符串的指针。
  • delimiters: 它表示一个包含所有界定符的字符串。

C Strtok()函数使用逗号的示例

让我们举一个例子来说明在C编程中C编程中使用逗号调用strtok()函数。

示例

编译并运行

输出

After splitting the char array values, we get: 
 Java 
 C++ 
 JavaScript

说明

在此示例中,我们演示了如何在C中使用strtok()函数将字符串拆分成使用逗号(,)作为界定符的令牌。这里,我们取字符串“Java, C++, JavaScript”,用逗号(,)将其拆分,并通过while循环单独打印每个令牌。

复杂度分析

该程序的复杂度分析如下:

时间复杂度

该程序的总体时间复杂度为O(n)。

空间复杂度

由于输入字符串存储,上述代码的总体空间复杂度为O(n)。

C Strtok()函数使用空格分割字符串的示例

让我们举一个例子来说明在C中使用空格的strtok()函数。

示例

编译并运行

输出

After splitting the char array values, we get: 
TPointTech 
is 
one 
of 
the 
Best 
Tutorial 
Websites

说明

在此示例中,我们演示了如何在C中使用strtok()函数将字符串拆分成使用空格作为界定符的令牌。在这里,我们取字符串“TPointTech is one of the Best Tutorial Websites”,并将其拆分成单独的单词。while循环继续查找令牌,直到没有更多令牌为止,每个令牌都打印在新的一行上。它有助于单独处理句子中的单词。

复杂度分析

该程序的复杂度分析如下:

时间复杂度

上述代码的总体时间复杂度为O(n)。

空间复杂度

由于输入字符串存储,上述代码的总体空间复杂度为O(n)。

C语言Strtok()函数的功能

C语言的strtok()函数有几个特点。其中一些如下:

  • strtok()函数在没有适当同步的情况下不应在多线程程序中使用,因为它不是线程安全的。
  • strtok()将连续的界定符字符字符串视为单个界定符,并且不会为每个界定符返回空令牌。
  • 当使用多字节字符集编码的输入字符串时,Strtok()可能无法与非ASCII字符正常工作,因此在使用时请谨慎。在这种情况下,我们可以使用不同的标记化方法。
  • 在从输入字符串中提取完所有令牌后,Strtok()返回一个NULL指针。它可以作为停止令牌处理的信号。
  • strtok()函数在输入字符串的界定符字符处用空字符('\0')替换。由于原始字符串已被修改,后续对strtok()的调用将从第一次中断的地方继续。
  • 通过将包含每个界定符的字符串作为第二个参数传递给strtok()函数,该函数可以处理多个界定符。

结论

总之,C编程中的strtok()函数是一个重要的功能,用于根据空格、命令和一些特殊字符等特定界定符将字符串分割成更小的令牌。它会修改原始字符串,并在后续调用中依次返回每个令牌。它简单高效,但它不是线程安全的,并且会修改输入字符串。strtok()主要用于解析字符串,执行多项任务,例如文本处理、命令行参数处理和数据提取。

Strtok()函数常见问题解答

1) C语言中的'strtok()'函数如何工作?

它按照以下步骤工作:

  1. 第一次调用时,它会传递要标记化的字符串。
  2. 该方法返回指向找到的第一个令牌的指针。
  3. 后续调用时,将'NULL'作为第一个参数传递,以继续标记化相同的字符串。
  4. 它通过将界定符替换为'\0'(即空终止符)来修改原始字符串。

2) C语言中的'strtok()'方法可以在多线程环境中使用吗?

'strtok()'方法不是线程安全的,因为它使用内部静态状态。我们可以使用'strtok_r',它是用于线程安全标记化的可重入版本。

3) 如果字符串包含连续的界定符,C语言中会发生什么?

在C编程中,'strtok()'方法将连续的界定符视为单个界定符并跳过它们,因此它不会返回空令牌。

4) 如果字符串以界定符开头怎么办?

如果字符串以界定符开头,则会跳过前导界定符,返回的第一个令牌将是第一个非界定符子字符串。

5) 如何在不修改原始字符串的情况下标记化字符串?

我们可以使用'strdup()'方法或'strcpy()'方法复制字符串,然后对副本使用'strtok()'方法。

6) C语言中的'strtok()'方法是否会修改原始字符串?

是的,strtok()方法用'\0'替换界定符字符以终止令牌。