我想创建一个可变长度的指针数组来进行字符串拆分。例如,类似:
>>> s="Hello my name is Sam".split()
['Hello', 'my', 'name', 'is', 'Sam']
我目前有一种通用的打印方法:
int main() {
char _string[] = "Hello my name is Sam";
char * string = _string;
char * token;
char * delim = " ";
token = strtok(string, delim);
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, delim);
}
}
如何创建一个可变长度的字符串指针数组?我的第一个想法只是选择一个很大的数字,但这似乎并不是最好的主意。
另外,有没有比使用以下更好的模式:
char _string[] = "Hello my name is Sam";
char * string = _string;
我觉得自己经常这样做,如果我以“正常”方式进行操作(即,对于初学者来说,这对我来说是最正常的方式):
char * string = "Hello my name is Sam";
我总会在路上找到一些
Bus Error
之类的东西。应该如何正确地做到这一点? 最佳答案
一种方法可能是先计算令牌的数量,然后为列表动态分配内存,然后填充列表。
在代码中,它可能看起来像这样:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int count_tokens(char *str, char *delim) {
if(str == NULL || strlen(str) == 0)
return 0;
int number = 0;
char *p = str, *prev = str;
while((p = strpbrk(p, delim)) != NULL) {
if(p != prev)
number++;
prev = ++p;
}
if(strlen(prev) != 0)
number++;
return number;
}
int main() {
char string[] = "Hello my name is Sam";
char *delim = " ";
int num_tokens = count_tokens(string, delim);
char **token_list = calloc(num_tokens, sizeof(char *));
char *token = strtok(string, delim);
for(int i = 0; i < num_tokens && token != NULL; i++) {
token_list[i] = token;
token = strtok(NULL, delim);
}
for(int i = 0; i < num_tokens; i++) {
printf("%s\n", token_list[i]);
}
free(token_list);
}
关于c - 来自strtok的String.split(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57815580/