Возможной альтернативой является использование функции BSD strsep()
вместо strtok()
, если таковая имеется. Из man page:
strsep()
функция предназначена в качестве замены для функции strtok()
.В то время как функция strtok()
должна быть предпочтительной для целей мобильности (она соответствует ISO/IEC 9899: 1990 («ISO C90»)) не может обрабатывать пустые поля, то есть обнаруживать поля, разделенные двумя смежными разделительными символами, или который будет использоваться более чем за одну строку за один раз: . Функция strsep()
впервые появилась в 4.4BSD.
Простой пример (также скопирован с этой страницы человека):
char *token, *string, *tofree;
tofree = string = strdup("value;;test;etc");
while ((token = strsep(&string, ";")) != NULL)
printf("token=%s\n", token);
free(tofree);
Выход:
token=value
token=
token=test
token=etc
так пустые поля обрабатываются корректно.
Конечно, как другие уже говорил, ни один из этих простых функций Tokenizer не обрабатывает разделителя внутри кавычек правильно, так что если это вопрос, вы должны использовать в надлежащего CSV разбор библиотеки.
Является ли 'strsep()' доступным на вашей платформе? Использование очень похоже на 'strtok()', но оно корректно возвращает пустые поля. –
@MartinR вероятно. Я использую Fedora w/Linux 3.10.10. – Mauren
Так что это может быть альтернатива. Но даже это не будет обрабатывать разделители внутри цитируемого текста, например 'aaa; bbb;" ddd; eee "; fff' правильно. –