C++中strtok()函数的实现


strtok() 函数是 C++ 中最常用的函数之一。此函数可以使用分隔符作为指导,将文本分割成较小的块或标记。借助 strtok() 函数,在 C++ 中处理字符串变得简单。本文将对 strtok() 函数进行全面探讨,包括其定义、语法、算法和各种实现方法。务必记住,strtok 函数有一些限制和潜在缺点。例如,它不能用于 const 或只读字符串,因为它会就地修改原始字符串。边缘情况和意外输入(例如空字符串或序列中重复出现的分隔符)也可能难以处理。

尽管存在这些缺点,但此函数对于许多程序员来说仍然是一个有用的工具,并且经常用于各种应用程序中,包括文本处理、数据解析和网络协议。它是一个灵活而强大的函数,可以极大地简化许多常规的编程任务。

strtok() 函数的特性

在 C++ 中,使用 strtok() 函数可以根据分隔符将字符串分割成较小的块或标记。该函数的两个输入是必须被标记化的字符串的指针和包含分隔符字符的字符串。该函数返回指向字符串第一个标记的指针。只要字符串中还有剩余的标记,使用相同字符串参数对函数的后续调用将返回附加的标记,这在 while 循环中借助 NULL 指针实现。再次调用 'strtok()' 函数时,提供 NULL 作为第一个参数会指示函数从上次对同一字符串进行标记化的地方继续。

当第一次使用输入字符串作为第一个参数调用函数 'strtok()' 时,它会从字符串开头开始查找第一个标记。当它找到第一个标记时,它会通过用空字符 ('\0') 替换其后的分隔符来终止它。当再次使用 NULL 指针作为第一个参数使用 'strtok()' 时,该函数会从上次对字符串进行标记化的地方继续,即紧跟在先前标记之后。它继续查找分隔符的下一个出现。

语法

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

其中

- `str` 是要标记化的字符串的指针。

- `delimiters` 是包含分隔符字符的字符串。

算法

  • 步骤 1 − `strtok()` 函数接受两个参数 - 第一个参数是要标记化的输入字符串,第二个参数是包含所有应用于将输入字符串分割成标记的分隔符的字符串。

  • 步骤 2 − 首次调用该函数时,输入字符串作为第一个参数传递,分隔符字符串作为第二个参数传递。

  • 步骤 3 − 该函数搜索输入字符串中任何分隔符字符的第一次出现。

  • 步骤 4 − 当它找到一个分隔符字符时,它会用空终止符 ('\0') 替换它,并返回指向第一个标记开头的指针。

  • 步骤 5 − 下次调用该函数时,第一个参数应设置为 `NULL`,而不是原始输入字符串。这告诉函数从中断的地方继续,并在字符串中搜索下一个标记。

  • 步骤 6 − 该函数继续搜索分隔符字符,并返回指向后续标记开头的指针,直到到达字符串的末尾,此时它返回 `NULL`。

遵循的方法

方法 1 − 使用循环和 strtok() 函数以及单个分隔符的程序代码。

方法 2 − 使用循环和 strtok() 函数以及多个分隔符的程序代码。

方法 1

以下是使用循环和 strtok() 函数以及单个分隔符的程序代码示例。

此示例演示如何使用 strtok 通过空格标记化字符串。首先将输入字符串 str 与分隔符“ ”一起传递给 strtok。对 strtok 的第一次调用返回指向第一个标记 (“Hi,”) 的指针,该指针被打印到控制台。strtok 继续标记化字符串,直到没有更多标记,并且每个标记都打印到控制台。请注意,对于 strtok 的后续调用,我们将空指针作为第一个参数传递,这表示我们想要继续标记化原始字符串。

示例 1

#include <iostream>
#include <cstring> // Include the header for strtok()
using namespace std;

int main() {
   char str[] = "Hi, this topic tells about strtok() function";
   char* ptr;
   ptr = strtok(str, " ");
   while (ptr != NULL) {
      cout << ptr << endl;
      ptr = strtok(NULL, " ");
   }
   return 0;
}

输出

Hi, 
this  
topic 
tells  
about 
strtok()  
function 

方法 2

以下是使用循环和 strtok() 函数以及多个分隔符的程序代码示例。

在此示例中,使用 '|' 和 ' '(空格)分隔符来标记化字符串“The boy|is|standing|with his pet|lazy dog.”。strtok() 方法被调用两次,一次使用字符串作为第一个参数,字符 '|' 和 ' ' 作为第二个参数。初始调用返回第一个标记“The”。循环继续运行,直到所有标记都被提取。

示例 2

#include <iostream> 
#include <cstring> 
 
int main() { 
   char str[] = "The boy|is|standing|with his pet|lazy dog."; 
   char* token = strtok(str, "| "); 
   while (token != NULL) { 
      std::cout << token << std::endl; 
      token = strtok(NULL, "| "); 
   } 
   return 0; 
} 

输出

The 
boy 
is 
standing 
with 
his 
pet 
lazy 
dog.

结论

总之,C++ strtok 函数是用于操作字符串的有用且有效的工具。尽管它有明显的限制和潜在缺点,但它仍然是解析和处理文本数据的常用选择,并且对于任何程序员来说都是一个有用的工具。

更新于:2023年7月21日

427 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.