I need an efficient function that extracts first second and rest of the sentence into three variables.
Asked
Active
Viewed 2.3k times
1
-
1Tis a duplicate - http://stackoverflow.com/questions/1483206/how-to-tokenize-string-to-array-of-int-in-c/ - but not exact – ChrisF Oct 12 '09 at 20:19
-
"on-disk" is one word or two words? – sambowry Oct 12 '09 at 20:29
-
Do you mean that the algorithm would take "abcd" and split it into 'a', 'b', and "cd" ? – Alex Moore Oct 12 '09 at 21:46
-
1No. "cat eats many rats" should give "cat", "eats" and "many rats" – Alex Xander Oct 12 '09 at 22:14
-
Ok then, my solution should work. Give it a try. – Alex Moore Oct 12 '09 at 22:16
-
I fixed the example, try it again. – Alex Moore Oct 13 '09 at 14:34
3 Answers
12
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
- 3,415
- 1
- 23
- 39
-
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 Oct 12 '09 at 20:33
-
-
2Its giving me first token in reminder and not the remaining sentence. – Alex Xander Oct 12 '09 at 22:20
-
-
Ahh, I played with it when I got home last night and fixed the example. Try it now, it should work. – Alex Moore Oct 13 '09 at 14:33
2
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
- 108,024
- 16
- 131
- 187
-
+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 Oct 13 '09 at 14:42
1

Byron Whitlock
- 52,691
- 28
- 123
- 168
-
1@BartłomiejSemańczyk Actually, if you take out the link it still says `strtok`, so it's still an answer. – MicroVirus Nov 21 '15 at 12:02
-