Я думаю, что strsep
по-прежнему является лучшим инструментом для этого:
while ((token = strsep(&str, ","))) my_fn(token);
Это буквально одна строка, которая разбивает строку.
Дополнительные круглые скобки являются стилистическим элементом чтобы указать, что мы намеренно проверяем результат присваивания, а не оператор равенства ==
.
Для того, чтобы этот шаблон работал, token
и str
имеют тип char *
. Если вы начали с строкового литерала, вы должны сначала сделать его копию:
// More general pattern:
const char *my_str_literal = "JAN,FEB,MAR";
char *token, *str, *tofree;
tofree = str = strdup(my_str_literal); // We own str's memory now.
while ((token = strsep(&str, ","))) my_fn(token);
free(tofree);
Если два разделителя отображаются вместе в str
, вы получите значение token
это пустая строка. Значение str
изменяется в том, что каждый встреченный разделитель перезаписывается нулевым байтом - еще одна веская причина для копирования первой строки, обрабатываемой первой.
В комментарии кто-то предположил, что strtok
лучше чем strsep
, потому что strtok
более портативен. У Ubuntu и Mac OS X есть strsep
; можно с уверенностью предположить, что и другие системы unixy. Windows не имеет strsep
, но имеет strbrk
, который позволяет эту короткую и сладкую замену strsep
:
char *strsep(char **stringp, const char *delim) {
if (*stringp == NULL) { return NULL; }
char *token_start = *stringp;
*stringp = strpbrk(token_start, delim);
if (*stringp) {
**stringp = '\0';
(*stringp)++;
}
return token_start;
}
Здесь является хорошим объяснением strsep
vs strtok
. Плюсы и минусы можно судить субъективно; однако, я думаю, это говорит о том, что strsep
был разработан как замена для strtok
.
Вам необходимо знать тип свойства и соответствующим образом отформатировать значение. Если это строка, заключите ее в двойные кавычки. то есть name = "John"
, но age = 20
.
Это не зависит от того, выглядит ли значение как число или нет.
code = "3"
).