В комментарии к вашему вопросу вы говорите, что вы "вызываете strtok на 'line' несколько раз, пока он не вернет NULL" Это звучит так, как будто вы используете strtok неправильно. В первый раз, когда вы вызываете это, вы должны вызывать это с 'line' в качестве аргумента; при последующих вызовах вы должны передать его NULL. В качестве примера возьмем следующее:
void function myFunc(char* line) {
char *segment; // This will point at each delimited substring in turn.
segment = strtok(line, " ");
// Do something with segment.
segment = strtok(NULL, " ");
// Do something with the new segment.
free(line);
}
Однако, как сказал DrTwox, ваш второй пример лучше - «строка» должна быть освобождена тем же контекстом, который неправильно ее (или нет), так что вызов free () не принадлежит этой функции. И вам лучше зацикливаться - что-то вроде:
void function myFunc(char* line) {
char *segment;
segment = strtok(line, " ");
while (segment != NULL) {
// Do something with segment.
segment = strtok(NULL, " ");
}
}
Вызов такой:
char *line = malloc(20*sizeof(char));
// Check that malloc succeeded here.
// Put some data into 'line'.
myFunc(line);
free(line);
// No 'garbageLine' required.
Способ работы strtok немного сложен для объяснения, но у вас есть важные части - он не выделяет и не освобождает память. Вместо этого он работает путем изменения строки, которую вы ему передали.