使用 C 语言中的 strsep 函数

Jinku Hu 2023年10月12日
使用 C 语言中的 strsep 函数

本文将演示如何在 C 语言中使用 strsep 函数的多种方法。

使用 strsep 函数在字符串中查找给定标记

strsep 是 C 标准库字符串实用程序的一部分,定义在 <string.h> 头文件中。它可以用来从字符串对象中提取被给定定界符包围的标记。

strsep 需要两个参数-指向 char*的指针和指向 char 的指针。第一个参数用于传递需要搜索的字符字符串的地址。第二个参数指定了一组定界符,用来标记提取的标记的开始和结束。请注意,在提取的标记字符串中,定界符会被丢弃。当找到第一个标记时,第一个参数被修改为存储指向下一个定界符的指针。

在下面的例子中,我们演示了如何使用对 strsep 的单次调用,提取两个以给定字符定界的标记。请注意,程序从 2 个命令行参数中获取字符串和定界符集,如果没有提供所需的参数,则以失败退出。接下来,我们用 strdupa 函数调用复制字符串,因为 strsep 修改了传递的指针,我们不想丢失原始值。strdupa 在栈上分配动态内存,调用者不应该释放从它返回的指针。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *str1, *token;

  if (argc != 3) {
    fprintf(stderr, "Usage: %s string delim\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  str1 = strdupa(argv[1]);
  if (!str1) exit(EXIT_FAILURE);

  token = strsep(&str1, argv[2]);
  if (token == NULL) exit(EXIT_FAILURE);

  printf("extracted: '%s'\n", token);
  printf("left: '%s'\n", str1);

  exit(EXIT_SUCCESS);
}

示例命令:

./program "hello there" t

输出:

extracted: 'hello '
left: 'here'

或者,我们可以实现 for 循环,连续调用 strsep 函数,并提取每一个带有给定定界符的标记,而不是只提取最先遇到的标记-如前面的示例代码所示。但请注意,当一行中有两个定界符时,strsep 会返回一个空字符串;因此,调用者有责任在处理结果标记之前检查这一点。类似的功能也可以用 strtokstrtok_r 库函数来提供,但略有不同,在这个页面上有详细描述。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *str1, *token;

  if (argc != 3) {
    fprintf(stderr, "Usage: %s string delim\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  str1 = strdupa(argv[1]);
  if (!str1) exit(EXIT_FAILURE);

  for (int j = 1;; j++) {
    token = strsep(&str1, argv[2]);
    if (token == NULL) break;
    printf("%d: '%s'\n", j, token);
  }

  exit(EXIT_SUCCESS);
}

示例命令:

./program "hello there" tl

输出:

1: 'he'
2: ''
3: 'o '
4: 'here'
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C String