c - 在 C 中不使用 strtok() 拆分字符串
问题描述
我正在尝试将一个句子拆分为单个单词的数组。
我最近意识到我不能在这个函数中使用 strtok(),现在我正在寻找一种不使用 strtok() 来实现这个函数的替代方法。有谁知道我该怎么做?
编辑:
我需要返回一个指向指向句子中各个单词的指针数组的指针。
解决方案
从我对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;
}
推荐阅读
- dart - Flutter Image 在底部淡出(渐变)
- java - Micronaut property injection does not work with Gradle multi-project build
- java - Sort with one element at the end
- php - Variable in SQL not working with prepare statement
- javascript - 两个自定义元素之间的依赖关系,以及 Polymer 服务的路径
- ruby-on-rails - Trouble when creating new article
- django - 将外键添加到 model_to_dict - Django 1.11
- javascript - 按钮具有特定类时的弹出窗口
- excel - Vba 将天转换为年、月、日
- javascript - Jquery select all radiobuttons in a table where id's are name the same