In this code I do not quite understand the lines
s = strspn (s, delim);
and
end = s strcspn (s, delim);
As far as I know strspn returns the index of first occurrence of a delimiter in string.
Therefore if s
is the string, then the delimiter
is at index strcspn (s, delim)-1
.
So, the command s = strspn (s, delim)
would move the string pointer to the index after the delimiter.
Which means if I have a string s = "Abc,dsf.eerr"
and delim = " ,.\n"
and then if I execute this line, s = strspn (s, delim);
then does that mean *s = 'd'?
What is the significance of this line end = s strcspn (s, delim);
.
I need to implement strtok where the delimiter is not deleted but returned as a parameter. I just need to understand how this code works to do so. This might be a very basic question but still thanks for your help.
char *
__strtok_r (char *s, const char *delim, char **save_ptr)
{
char *end;
if (s == NULL)
s = *save_ptr;
if (*s == '\0')
{
*save_ptr = s;
return NULL;
}
/* Scan leading delimiters. */
s = strspn (s, delim);
if (*s == '\0')
{
*save_ptr = s;
return NULL;
}
/* Find the end of the token. */
end = s strcspn (s, delim);
if (*end == '\0')
{
*save_ptr = end;
return s;
}
/* Terminate the token and make *SAVE_PTR point past it. */
*end = '\0';
*save_ptr = end 1;
return s;
}
CodePudding user response:
Imagine it like this:
char *str = ",.,.,.DEF,.,.,.GAH";
char *s = str;
char *delim = ",.";
Now, you want to get to field DEF
. So what you do:
To find the start of the field, you have to advance as long as there are delimiters:
s = strspn(s, delim)
strspn(s, delim) = strlen(",.,.,.") = 6
- So
*s = D
To find the end of the field from there, you have to advance as long as there are no delimiters:
end = s strcspn(s, delim)
strcspn(s, delim) = strlen("DEF") = 3
- So:
*end = ','
Which means if I have a string s = "Abc,dsf.eerr" and delim = " ,.\n" and then if I execute this line, s = strspn (s, delim); then does that mean *s = 'd'?
No, strspn("Abc,dsf.eerr", " ,.\n") = 0
. A
is not in " ,.\n"
.
What is the significance of this line end = s strcspn (s, delim);
To find the end of the field, which we will be starting from on the next cycle.