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: 
You say:

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

That call is illegal - strtok modifies its first parameter and you are not allowed to modify string literals. What you get is undefined behaviour - anything could happen. You want:

```
char a[] = "abc,def";
f1( a );

```
`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`.