C 使用 strtok() 将字符串拆分为字符串数组,最后一个元素不为 NULL

C split string into string array using strtok() without NULL as last element

我有这样的字符串:

"monday,wednesday,friday"

我想将其保存到一个字符数组(~字符串数组)中。

char **splitString(char *string, int size, char delimiter)
{
  char **ptr = (char **)malloc(size * sizeof(char *));
  int i = 0;
  ptr[i] = strtok(string, &delimiter);
  while (ptr[i] != NULL)
  {
    ptr[++i] = strtok(NULL, &delimiter);
  }
  return ptr;
}

设法用上面的代码做到了,但由于它总是检查当前的标记化字符串,它不会在最后一个字符串处停止并读取一个额外的 NULL。打印出我得到的数组:

The 0. element is: monday
The 1. element is: wednesday
The 2. element is: friday
The 3. element is: (null)

有没有一种简洁明了的方法可以知道循环何时到达最后一个元素?

使用类似这样的东西

char **splitString(char *string, int size, char delimiter)
{
  char **ptr = (char **)malloc(size * sizeof(char *));
  char *p;
  int i = 0;
  p = strtok(string, &delimiter);
  while (p != NULL)
  {
    ptr[i++] = p;
    p = strtok(NULL, &delimiter);
  }
  return ptr;
}

您可以使用 , 作为简单循环的分隔符:

counter = 0;
counter2;
char thing [][]
char YourString 
for(i = 0;i<=20;i++){

if(YourString !=","){
thing[counter][i]=yourString[counter2]
}
else{
counter++;
}
counter2++;
}

嗯,您可以实现您的目标,只需将每个 , 更改为 [=12=] 并将指针数组设置为指向字符串的第一个字符以及 [= 之后的每个字符11=]。有点像:

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

char **split_string(char *str, int *size) {
    int i;
    *size = 1;
    printf("size = %d\n", *size);
    char **array = malloc(*size * sizeof(char *));
    array[0] = &str[0];
    for (i = 1; str[i] != 0; i++) {
        if (str[i] == ',') {
            (*size)++;
            printf("size = %d\n", *size);
            array = realloc(array, sizeof(char *) * (*size));
            array[(*size) - 1] = &str[i + 1];
            str[i] = '[=10=]';
        }
    }
    return array;
}

int main() {
    char str[] = "one,two,three";
    int size;
    char **array = split_string(str, &size);
    for (int i=0; i < size; i++) {
        printf("%s\n", array[i]);
    }
    return 0;
}