Часто бывает полезно пройти разделителей использовать с strtok
как параметр функции для разделения съел строку в токены. Вы также можете использовать петлю for
с strtok
, чтобы убрать код при определенных обстоятельствах.
Поскольку количество указателей, назначенных результирующему массиву, никогда не может быть отрицательным, выбор типа данных size_t
или unsigned
может помочь компилятору указать, будет ли эта переменная позже использоваться неправильно.
И, наконец, при использовании массива указателей статического размера для удержания указателей для каждого токена важно проверить количество назначенных указателей, чтобы предотвратить запись за пределы вашего массива. примечание:, если вы назначаете указатели динамически (с malloc
или calloc
), вы можете позвонить realloc
, когда достигнут ваш начальный лимит, а затем, при необходимости.
Ввод различных частей вместе, альтернатива будет:
#include <stdio.h>
#include <string.h>
#define MAXP 100
void separate_words (char *a[], char *s, char *delim, size_t *n);
int main (void)
{
char str[] = "apple banana orange pineapple";
char *delim = " \t\n";
char *matrix[MAXP] = { NULL };
size_t how_many = 0;
size_t i;
separate_words (matrix, str, delim, &how_many);
for (i = 0; i < how_many; i++)
printf ("matrix[%zu] = %s\n", i, matrix[i]);
return 0;
}
/* separate 's' into tokens based on delimiters provided in 'delim'
* with pointers to each token saved in 'a' with 'n' updated to hold
* the number of pointers contained in 'a'.
*/
void separate_words (char *a[], char *s, char *delim, size_t *n)
{
*n = 0;
char *p = strtok (s, delim);
for (; p; p = strtok (NULL, delim)) {
a[(*n)++] = p;
if (*n == MAXP) {
fprintf (stderr, "warning: pointer limit reached.\n");
return;
}
}
}
Выход
$ ./bin/strtok_static
matrix[0] = apple
matrix[1] = banana
matrix[2] = orange
matrix[3] = pineapple
Создание Использование возвратного
Кроме того, вы можете использовать функция возвращает, чтобы вернуть количество токенов в строке. Это устраняет необходимость передавать переменную указателя в качестве параметра функции:
#include <stdio.h>
#include <string.h>
#define MAXP 100
size_t separate_words (char *a[], char *s, char *delim);
int main (void)
{
char str[] = "apple banana orange pineapple";
char *delim = " \t\n";
char *matrix[MAXP] = { NULL };
size_t how_many = 0;
size_t i;
how_many = separate_words (matrix, str, delim);
for (i = 0; i < how_many; i++)
printf ("matrix[%zu] = %s\n", i, matrix[i]);
return 0;
}
/* separate 's' into tokens based on delimiters provided in 'delim'
* with pointers to each token saved in 'a'. The number of tokens is
* returned.
*/
size_t separate_words (char *a[], char *s, char *delim)
{
size_t n = 0;
char *p = strtok (s, delim);
for (; p; p = strtok (NULL, delim)) {
a[n++] = p;
if (n == MAXP) {
fprintf (stderr, "warning: pointer limit reached.\n");
break;
}
}
return n;
}
Можете ли вы отправить код, где параметры функции объявлены и инициализированы? – EkcenierK
Возможный дубликат [C - разделительная строка в массив строк] (http://stackoverflow.com/questions/11198604/c-split-string-into-an-array-of-strings) – usr2564301
@KLibby Я не знаю, т. Я положил его на блокнот. – Hassan