我想创建一个可变长度的指针数组来进行字符串拆分。例如,类似:

>>> 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/

10-11 19:15