首页 > 解决方案 > 在 C 中不使用 strtok() 拆分字符串

问题描述

我正在尝试将一个句子拆分为单个单词的数组。

我最近意识到我不能在这个函数中使用 strtok(),现在我正在寻找一种不使用 strtok() 来实现这个函数的替代方法。有谁知道我该怎么做?

编辑:

我需要返回一个指向指向句子中各个单词的指针数组的指针。

标签: c

解决方案


从我对https://stackoverflow.com/a/63866151/13422上一个现已结束的问题的回答中复制而来

您将查看 C 标准库中 C 头文件提供的函数列表,<string.h>您会发现很多选项。

我写了一些东西只是为了好玩:

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

struct token {
  const char *str;
  size_t len;
};

struct token next_token(const char *str, const char *sep) {
  struct token tok;
  /* skip leading separator characters */
  str += strspn(str, sep);
  tok.str = str;
  tok.len = strcspn(str, sep);
  return tok;
}

struct token *get_tokens(const char *str, const char *sep) {
  size_t len = 0, cap = 8;
  struct token *arr = malloc(cap * sizeof *arr);

  for (struct token tok = next_token(str, sep); tok.len;
       tok = next_token(tok.str + tok.len, sep)) {
    arr[len] = tok;
    ++len;
    if (len == cap) {
      cap *= 2;
      arr = realloc(arr, cap * sizeof *arr);
    }
  }
  arr[len].str = NULL;
  arr[len].len = 0;
  return arr;
}

int main(int argc, char *argv[]) {
  if (argc < 2)
    exit(EXIT_FAILURE);

  puts("Token array");
  struct token *token_arr = get_tokens(argv[1], " \t\n");
  for (size_t i = 0; token_arr[i].str; ++i) {
    printf("\"%.*s\" ", (int)token_arr[i].len, token_arr[i].str);
  }
  putchar('\n');
  free(token_arr);

  puts("Next token loop");
  for (struct token tok = next_token(argv[1], " \t\n"); tok.len;
       tok = next_token(tok.str + tok.len, " \t\n")) {
    printf("\"%.*s\" ", (int)tok.len, tok.str);
  }
  putchar('\n');
  return EXIT_SUCCESS;
}

推荐阅读