c++ - 我正在尝试使用数组从头开始创建一个 strtok 函数

标签 c++

我不确定从这里去哪里。我正在尝试使用数组从头开始执行 strtok 函数。我想将每个标记存储在临时数组中,打印它,然后对数组将拥有的尽可能多的标记继续执行此操作。例如,将诸如“this is fab”之类的字符串复制到 temp,直到遇到定界符(null、空格或任何字符)。然后打印出来。一切的最终结果应该是:

这个\n

是\n

很棒\n

有没有大神知道。

char strtok( char s[], char key)
{
char find;
char temp[100] = " ";

int i = 0;
while( s[i] != '\0')
{
    i++;
    for(; s[find] != key && s[find] != '\0'; find++)
    {
        temp[i]= s[find];
    }
            cout<<endl;

    }

for( int x = 0; temp[x] != '\0'; x++)
    {
        cout<<temp[x];
    }

    cout<<endl;
}

最佳答案

标准strtok定义如下:

char *strtok(char *str, const char *delim)

对于自制版本,它必须返回char*。下面的示例类似于标准版本,但它使用 char 作为分隔符。

另请参阅 strtok 的示例

在第一次调用函数时应该设置变量。在随后的调用中,它应该从之前中断的地方继续。

char *homemade_strtok(char *arg, const char delimiter)
{
    static int pos = 0;
    static char* buf = 0;
    static char* token = 0;

    if (arg)
    {
        //start a new search
        pos = 0;
        buf = arg;

        //delete previous token if any
        if (token) delete token;

        //create token at least as big as the argument
        token = new char[strlen(buf) + 1];
    }

    if (!buf)
        return 0;

    if (pos >= strlen(buf))
        return 0;

    //prepare the token
    memset(token, 0, strlen(buf) + 1);

    int i = 0;
    while (pos < strlen(buf))
    {
        if (buf[pos] == delimiter)
        {
            pos++;
            return token;
        }
        token[i] = buf[pos];
        i++;
        pos++;
    }

    return token;
}

int main() 
{
    char *buf = "hello world 1a 2b 3c";
    char *token = homemade_strtok(buf, ' ');
    while (token)
    {
        std::cout << token << "\n";
        token = homemade_strtok(NULL, ' ');
    }
    return 0;
}

已编辑:修复内存泄漏

关于c++ - 我正在尝试使用数组从头开始创建一个 strtok 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36713158/

相关文章:

c++ - 如何在 C++ 中减去两个位集

c++ - Visual Studio 2017 中的 sfml 静态链接错误

c++ - 在 C++ 中从文件中读取 double 的最快方法

c++ - 使用 SSE 获取 __m128i vector 中的最小短值?

c++ - 使用自动 : where can it be useful? 公开私有(private)类型

c++ - 避免在期望解析器失败时抛出 expectation_failure

带参数的 C++ 简单线程(无 .net)

c++ - 右值参数的模板类型推导

C++ 我可以使用 string::at 分配一个 int 吗?

c++ - cpp 使用命名空间时出现错误重复符号