请实现strtok()函数
时间: 2024-04-24 09:25:24 浏览: 93
strtok函数C实现
5星 · 资源好评率100%
为了实现类似 `strtok` 函数的功能,你可以编写一个自定义的分割字符串函数。下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <string.h>
char* my_strtok(char* str, const char* delimiters) {
static char* buffer = NULL;
if (str != NULL) {
buffer = str;
}
if (buffer == NULL) {
return NULL;
}
char* token = buffer;
char* delimiter = strchr(buffer, *delimiters);
if (delimiter != NULL) {
*delimiter = '\0';
buffer = delimiter + 1;
} else {
buffer = NULL;
}
return token;
}
int main() {
char str[] = "Hello,World,C Language";
const char delimiters[] = ", ";
char* token = my_strtok(str, delimiters);
while (token != NULL) {
printf("%s\n", token);
token = my_strtok(NULL, delimiters);
}
return 0;
}
```
在上述示例中,我们定义了一个名为 `my_strtok` 的函数,它模拟了 `strtok` 函数的行为。函数接受一个字符串 `str` 和一个定界符字符串 `delimiters` 作为参数。
在函数内部,我们使用一个静态变量 `buffer` 来保存待分割的字符串。首次调用 `my_strtok` 时,我们将传入的字符串 `str` 赋值给 `buffer`;之后的调用中,如果传入 `NULL`,则表示继续对上一次分割的字符串进行分割。
接下来,我们使用 `strchr` 函数来查找 `buffer` 中第一个出现在 `delimiters` 中的字符,并将其替换为字符串结束符(`\0`)。然后,我们将 `token` 指向分割前的子字符串的起始地址,将 `buffer` 更新为下一个未分割的子字符串的起始地址。
最后,我们返回 `token`,即分割前的子字符串的起始地址。
在 `main` 函数中,我们定义了一个示例字符串 `str`,其中包含了几个单词和逗号分隔符。然后,我们定义了一个定界符字符串 `delimiters`,其中包含了逗号和空格两个定界符。
接下来,我们使用 `my_strtok` 函数将字符串 `str` 按照定界符进行分割。首次调用时,我们传入 `str` 和 `delimiters`,函数返回第一个分割后的子字符串的指针。之后,我们通过一个循环使用 `my_strtok(NULL, delimiters)` 继续获取下一个分割后的子字符串的指针,直到所有子字符串都被分割完毕。
运行示例代码将输出:
```
Hello
World
C
Language
```
请注意,这只是一个简单的示例代码,仅用于演示如何实现类似 `strtok` 函数的功能。实际上,`strtok` 函数具有更复杂的特性和用法,例如保存分割状态等。因此,如果需要更完整和健壮的实现,请参考 C 标准库中的 `strtok` 函数或其他相关的开源实现。
阅读全文