I need an efficient function that extracts first second and rest of the sentence into three variables.
+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
2009-10-12 20:19:42
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
2009-10-12 20:33:26
Very true, changed example to use strtok_r
Alex Moore
2009-10-12 20:51:06
Its giving me first token in reminder and not the remaining sentence.
Alex Xander
2009-10-12 22:20:32
remainder will hold "first" here.
AJ
2009-10-13 09:27:07
Ahh, I played with it when I got home last night and fixed the example. Try it now, it should work.
Alex Moore
2009-10-13 14:33:54
+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
2009-10-12 20:20:40
+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
2009-10-13 14:42:29