Segmentation Fault when using strtok_r
Can anyone explain why I am getting segmentation fault in the following example?
#开发者_Python百科include <stdio.h>
#include <string.h>
int main(void) {
char *hello = "Hello World, Let me live.";
char *tokens[50];
strtok_r(hello, " ,", tokens);
int i = 0;
while(i < 5) {
printf("%s\n", tokens[i++]);
}
}
Try this:
#include <stdio.h>
#include <string.h>
int main(void) {
char hello[] = "Hello World, Let me live."; // make this a char array not a pointer to literal.
char *rest; // to point to the rest of the string after token extraction.
char *token; // to point to the actual token returned.
char *ptr = hello; // make q point to start of hello.
// loop till strtok_r returns NULL.
while(token = strtok_r(ptr, " ,", &rest)) {
printf("%s\n", token); // print the token returned.
ptr = rest; // rest contains the left over part..assign it to ptr...and start tokenizing again.
}
}
/*
Output:
Hello
World
Let
me
live.
*/
- You need to call
strtok_r
in a loop. The first time you give it the string to be tokenized, then you give itNULL
as the first parameter. strtok_r
takes achar **
as the third parameter.tokens
is an array of 50char *
values. When you passtokens
tostrtok_r()
, what gets passed is achar **
value that points to the first element of that array. This is okay, but you are wasting 49 of the values that are not used at all. You should havechar *last;
and use&last
as the third parameter tostrtok_r()
.strtok_r()
modifies its first argument, so you can't pass it something that can't be modified. String literals in C are read-only, so you need something that can be modified:char hello[] = "Hello World, Let me live.";
for example.
A bunch of things wrong:
hello
points to a string literal, which must be treated as immutable. (It could live in read-only memory.) Sincestrtok_r
mutates its argument string, you can't usehello
with it.You call
strtok_r
only once and don't initialize yourtokens
array to point to anything.
Try this:
#include <stdio.h>
#include <string.h>
int main(void) {
char hello[] = "Hello World, Let me live.";
char *p = hello;
char *tokens[50];
int i = 0;
while (i < 50) {
tokens[i] = strtok_r(p, " ,", &p);
if (tokens[i] == NULL) {
break;
}
i++;
}
i = 0;
while (i < 5) {
printf("%s\n", tokens[i++]);
}
return 0;
}
strtok_r tries to write null characters into hello (which is illegal because it is a const string)
You have understood the usage of strtok_r incorrectly. Please check this example and documentation
And try & see this:
#include <stdio.h>
#include <string.h>
int main(void)
{
char hello[] = "Hello World, let me live.";
char *tmp;
char *token = NULL;
for(token = strtok_r(hello, ", ", &tmp);
token != NULL;
token = strtok_r(NULL, ", ", &tmp))
{
printf("%s\n", token);
}
return 0;
}
I think it might be the char *tokens[50];
because you are declaring it a pointer when it is already a pointer. An array is already a pointer upon declaration. You mean to say char tokens[50];
. That should do the trick.
精彩评论