C разбить строку на массив строк, используя strtok () без NULL в качестве последнего элемента - PullRequest
0 голосов
/ 29 марта 2020

У меня есть такая строка:

"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)

Существует ли краткий и простой способ узнать, когда l oop достигает последнего элемента?

Ответы [ 3 ]

2 голосов
/ 29 марта 2020

Итак, вы можете достичь sh своей цели, просто изменив каждый , на \0 и установив массив указателей на первый символ строки и на каждый символ после ,. Как-то так:

#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] = '\0';
        }
    }
    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;
}
1 голос
/ 29 марта 2020

Используйте что-то вроде этого

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;
}
0 голосов
/ 29 марта 2020

Вы можете использовать в качестве разделителя с простым l oop:

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

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