views:

506

answers:

3

I need an efficient function that extracts first second and rest of the sentence into three variables.

+3  A: 

strtok()

Byron Whitlock
+4  A: 

Easy way: Use strtok() or strtok_r to get the first two tokens, which will remove them from the string, so the string itself will be your third token you were looking for.

Hard way: Parse it yourself :(

Strtok is in the C string library, and will mutate your original string so be careful, copy the string first if it needs to remain intact.

Possible Example:

//#include <string.h>

char input[] ="first second third forth";
char delimiter[] = " ";
char *firstWord, *secondWord, *remainder, *context;

int inputLength = strlen(input);
char *inputCopy = (char*) calloc(inputLength + 1, sizeof(char));
strncpy(inputCopy, input, inputLength);

firstWord = strtok_r (inputCopy, delimiter, &context);
secondWord = strtok_r (NULL, delimiter, &context);
remainder = context;

printf("%s\n", firstWord);
printf("%s\n", secondWord);
printf("%s\n", remainder);

getchar();
free(inputCopy);

This should work just fine and be threadsafe with the original string unmutated.

Alex Moore
Another gotcha is that strtok() uses an internal static variable, so it is not thread safe. Use strtok_r() if that's an issue.
Fred Larson
Very true, changed example to use strtok_r
Alex Moore
Its giving me first token in reminder and not the remaining sentence.
Alex Xander
remainder will hold "first" here.
AJ
Ahh, I played with it when I got home last night and fixed the example. Try it now, it should work.
Alex Moore
+1  A: 

You need to define the delimiters first. There are a few problems with strtok (it modifies its argument, for one, which may land you in trouble). I prefer to read in the string and run a custom parser which may range from sscanf to a full-blown parser. Please post some more detail.

dirkgently
+1 `sscanf()` would work well, since I expect "words" means "anything not whitespace," making the conversion specifier easy, and should neatly avoid all the problems with `strtok()` and friends.
Chris Lutz