strtok() 函数不修改原始字符串,应该为要返回的标记创建一个新字符串

strtok()function which does not modify the original string, and should create a new string for the tokens to be returned

我正在尝试实现自己的 strtok 函数,但在这里我注意到它改变了原来的 string.I 想要以这样的方式实现它,它应该为要返回的标记创建一个新的字符串并且它确实不修改原始字符串。 虽然我在 main 函数中实现了它,但它应该在 strtok 函数本身中处理。

我的代码如下:


char *my_strtok(char * s2, char * delimit);//function prototyping
int main()
{
   char arr1[50]={"abc-efgh-ijkl-mnopq"}; 
   char buffer[50];
   sprintf(buffer,"%s",arr1);//for retaining the original string
   char *split  = my_strtok(arr1,"-");
   
   while(split != NULL)
   {
       printf("%s\t",split);
       split=my_strtok(NULL,"-");
       
   }
   
   return 0;
}
char *my_strtok(char * s2, char * delimit)
{
   int j=0;
   static int curr;
   static char* s;
   int start=curr;
   if(s2 != NULL)
   {
       s=s2;
   }
   while(s[curr]!='[=10=]')
   {
       j=0;
       while(delimit[j]!='[=10=]')
       {
           if(s[curr]==delimit[j])//comparing the delimiter in the string
           {
               s[curr]='[=10=]';//replaces the delimiter by delimiter
               curr=curr+1;//increment the curr position by 1
               if(s[start]!='[=10=]')//here start=0 returns characters till encounters '[=10=]'
               {
                  return (&s[start]);
                  
               }
               else
               {
                 start=curr;//Move to the next string after the delimiter
                 
               }
           }
        j++;   
       }
     curr++;  
   }
       
       
   s[curr] = '[=10=]';
   if(s[start] == '[=10=]')
       return NULL;
   else
       return &s[start];
}

I want to implement it in such a way it should create a new string for the tokens to be returned and it does not modify the original string.

在这种情况下,函数参数应使用限定符 const 声明,如

char * my_strtok( const char *s2, const char *delimit );

在这个 if 语句之后

if(s2 != NULL)
{
    s=s2;
}

两个指针 ss2 指向同一个字符串。所以这样的陈述

s[curr]='[=12=]';

改变原来的字符数组。

您需要动态分配一个数组来存储子字符串。总的来说,您需要记住在不再需要时释放动态分配的数组。

函数可以这样定义,如下面的演示程序所示。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char * my_strtok( const char *s, const char *delimit )
{
    static const char *p;

    if ( ( s == NULL ) && (  p == NULL ||  *p == '[=13=]' ) )
    {
        return NULL;
    }

    if ( s )
    {
        p = s;
    }

    p += strspn( p, delimit );

    if ( *p == '[=13=]' )
    {
        return NULL;
    }

    const char *start = p;

    p += strcspn( p, delimit );

    size_t n = p - start;

    char *substr = malloc( n + 1 );

    if ( substr )
    {
        substr[n] = '[=13=]';
        memcpy( substr, start, n );
    }

    return substr;                      
}

int main(void) 
{
    const char *s = "abc-efgh-ijkl-mnopq";

    char *p = my_strtok( s, "-" );

    while ( p != NULL )
    {
        puts( p );
        free( p );
        p = my_strtok( NULL, "-" );
    }

    return 0;
}

程序输出为

abc
efgh
ijkl
mnopq