Question: I have a function using strtok like this

```
void f1(char *name)
{
...
char *tmp;
tmp = strtok(names, " ,");
while(tmp)
{
...
tmp = strtok(NULL, " ,");
}
...
}

```

And i have a call f1("abc,def");

Problem is that in first call f1 gets abc,def
and in 2nd call gets just abc

I am confused.. Why is this so?

Answer: 
Are you truly passing in a string literal?

```
f1("abc,def");

```

will pass a pointer to the string literal to the `strtok()` in `f1()` - since `strtok()` modifies the string, and a string literal can't be modified, so you'll get undefined behavior (though I would expect a crash or fault instead of unexpected results).
`strtok` puts a null terminator after each token it returns. This means that it destroys the original string: After calling it, your string will be terminated after the first token, resulting in the behavior you see.

To keep the original string unchanged, you will need to make a copy of it before calling `strtok`.