Я пишу парсер ввода CLI, и я хочу знать, что является самым быстрым алгоритмом для разбиения строки на токены.Самый быстрый алгоритм для разбиения строки на C?
Правила:
- Пространство означает конец маркера.
- Любой символ может быть экранирован с помощью обратного слэша, что означает, что я воспринимаю его как без какого-либо специального значения. (В настоящее время используется только для выхода в пространство)
Вот код, я в настоящее время с помощью:
#define POINTER_ARRAY_STEP 10
#define STRING_STEP 255
char **parse_line(char *line)
{
char **array;
size_t array_len;
size_t array_index;
size_t token_len;
size_t token_index;
array_len = POINTER_ARRAY_STEP;
array = malloc((array_len + 1) * sizeof(char*)); /* +1 to leave space for NULL */
array_index = 0;
token_len = STRING_STEP;
array[array_index] = malloc(token_len + 1);
token_index = 0;
for (; *line; ++line) {
if (array_index == array_len) {
array_len += POINTER_ARRAY_STEP;
array = realloc(array, (array_len + 1) * sizeof(char*));
}
if (token_index == token_len) {
token_len += STRING_STEP;
array[array_index] = realloc(array[array_index], token_len + 1);
}
if (*line == '\\') {
array[array_index][token_index++] = *++line;
continue;
}
if (*line == ' ') {
array[array_index][token_index] = 0;
array[++array_index] = malloc(token_len + 1);
token_index = 0;
continue;
}
array[array_index][token_index++] = *line;
}
/* Null terminate the last array element */
array[array_index][token_index] = 0;
/* Null terminate the array */
array[array_index + 1] = NULL;
return array;
}
'Foo = перераспределить (Foo, some_size)' всегда плохая идея: если вызов не вы должны освободить исходный указатель 'Foo', который вам только что написали. –
@ DanielJour да, и ради исполнения, перераспределение по одному не является оптимальным. В этом разница между размером и емкостью. –
Самый быстрый из * которые * алгоритмы? Это зависит от того, готовы ли вы жертвовать входной строкой, как это делает 'strtok'. Мой выбор состоял бы в продвижении по строке с помощью 'strchr' и записи nul-терминаторов в пространства строки (копии). –