在 C 中的嵌套循环中使用 strtok() 吗?

发布于 2024-08-07 09:06:05 字数 361 浏览 3 评论 0原文

我试图在嵌套循环中使用 strtok() 但这并没有给我想要的结果, 可能是因为它们使用相同的内存位置。我的代码的形式为:-

char *token1 = strtok(Str1, "%");
while (token1 != NULL)
{
    char *token2 = strtok(Str2, "%");
    while (token2 != NULL)
    {
        //Do something
        token2 = strtok(NULL, "%");
    }
    // Do something more
    token1 = strtok(NULL, "%");
}

I am trying to use strtok() in nested loops but this is not giving me desired results,
possibly because they are using the same memory location. My code is of the form:-

char *token1 = strtok(Str1, "%");
while (token1 != NULL)
{
    char *token2 = strtok(Str2, "%");
    while (token2 != NULL)
    {
        //Do something
        token2 = strtok(NULL, "%");
    }
    // Do something more
    token1 = strtok(NULL, "%");
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

左岸枫 2024-08-14 09:06:05

是的,strtok() 确实使用一些静态内存来保存调用之间的上下文。使用可重入版本的 strtok()strtok_r() 代替,或者如果您使用 VS,则使用 strtok_s()(与 strtok_r() )。

它有一个附加的上下文参数,您可以在不同的循环中使用不同的上下文。

char *tok, *saved;
for (tok = strtok_r(str, "%", &saved); tok; tok = strtok_r(NULL, "%", &saved))
{
    /* Do something with "tok" */
}

Yes, strtok(), indeed, uses some static memory to save its context between invocations. Use a reentrant version of strtok(), strtok_r() instead, or strtok_s() if you are using VS (identical to strtok_r()).

It has an additional context argument, and you can use different contexts in different loops.

char *tok, *saved;
for (tok = strtok_r(str, "%", &saved); tok; tok = strtok_r(NULL, "%", &saved))
{
    /* Do something with "tok" */
}
笔落惊风雨 2024-08-14 09:06:05

strtok 使用静态缓冲区。
在你的情况下,你应该使用 strtok_r。该函数使用用户提供的缓冲区。

strtok is using a static buffer.
In your case you should use strtok_r. This function is using a buffer provided by the user.

无远思近则忧 2024-08-14 09:06:05

WayneAKing 发布了替代方案 在 Microsoft 开发人员中心。

引用他的话:

去这里

http://cpp.snippets。组织/代码/

并下载此文件

stptok.c 改进的标记化
功能

您也可以下载需要的
来自同一站点的头文件。

这是strtok的修改版本
它放置解析的令牌
(子字符串)在单独的缓冲区中。你
应该能够将其修改为
满足您的需求。

  • 韦恩

PS - 请注意,这些文件可能位于
*nix 格式与行尾有关。即 - 仅 0x0A 而不是
0x0D 0x0A

如果您的环境中没有 Microsoft 库,这是一种替代方法。

WayneAKing posted an alternative in the Microsoft Developer Center.

Citing him:

Go here

http://cpp.snippets.org/code/

and download this file

stptok.c Improved tokenizing
function

You can also download the needed
header files from the same site.

This is a modified version of strtok
which places the parsed tokens
(substrings) in a separate buffer. You
should be able to modify it to
accommodate your needs.

  • Wayne

P.S. - Note that these files may be in
*nix format with respect to end-of-lines. i.e. - 0x0A only and not
0x0D 0x0A

This is an alternative if you don't have the Microsoft libraries in your environment.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文