gpt4 book ai didi

c - 如何使用 strtok()

转载 作者:行者123 更新时间:2023-12-03 20:22:01 26 4
gpt4 key购买 nike

我正在写一个 C 程序来研究函数的用法 strtok() .这是我的代码:

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

main() {
char abc[100] = "ls &";
char *tok;

tok = strtok(abc, " ");
while (tok != NULL) {
printf("%s", tok);
tok = strtok(NULL, " ");
}
printf("\n\n\n\n\n%s", tok);
return 0;
}

它正在打印以下输出:
ls&




(null)

但我希望它打印 &在第二 printf陈述。我该怎么做?我的家庭作业项目需要这部分。

最佳答案

  • 确保您可以在打印时确定打印内容的限制。
  • 在打印消息的末尾输出换行符;如果您这样做,信息更有可能及时出现。
  • 不要将 NULL 指针打印为字符串;并非所有版本的 printf()会表现得很好——其中一些会转储核心。

  • 代码:
    #include <stdio.h>
    #include <string.h>

    int main(void)
    {
    char abc[] = "ls &";
    char *tok;
    char *ptr = abc;

    while ((tok = strtok(ptr, " ")) != NULL)
    {
    printf("<<%s>>\n", tok);
    ptr = NULL;
    }
    return 0;
    }

    或者(优化,由 self. 提供):
    #include <stdio.h>
    #include <string.h>

    int main(void)
    {
    char abc[] = "ls &";
    char *tok = abc;

    while ((tok = strtok(tok, " ")) != NULL)
    {
    printf("<<%s>>\n", tok);
    tok = NULL;
    }
    return 0;
    }

    输出:
    <<ls>>
    <<&>>

    您可以选择自己的标记字符,但是当不使用 XML 或 HTML 时,我发现双尖括号非常适合这项工作。

    你也可以使用你的循环结构,代价是编写第二次调用 strtok() (这是最低成本,但可能会被认为违反 DRY 原则:不要重复自己):
    #include <stdio.h>
    #include <string.h>

    int main(void)
    {
    char abc[] = "ls &";
    char *tok = strtok(abc, " ");

    while (tok != NULL)
    {
    printf("<<%s>>\n", tok);
    tok = strtok(NULL, " ");
    }
    return 0;
    }

    相同的输出。

    修订要求

    I would like to add a printf() statement outside the while loop and print '&' outside. I need it since I want to compare it later with another variable in the program. Is there any way to do so?



    是的,通常有一种方法可以做几乎任何事情。这似乎有效。如果要解析的标记更多,或者只有 &,它也能正常工作。解析,或者如果没有 token 。显然,如果您愿意,可以将外循环的主体变成一个函数;这样做是明智的,甚至。
    #include <stdio.h>
    #include <string.h>

    int main(void)
    {
    char tests[][16] =
    {
    "ls -l -s &",
    "ls &",
    "&",
    " ",
    ""
    };

    for (size_t i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
    {
    printf("Initially: <<%s>>\n", tests[i]);
    char *tok1 = strtok(tests[i], " ");
    char *tok;

    while ((tok = strtok(NULL, " ")) != NULL)
    {
    printf("Loop body: <<%s>>\n", tok1);
    tok1 = tok;
    }
    if (tok1 != NULL)
    printf("Post loop: <<%s>>\n", tok1);
    }

    return 0;
    }

    输出:
    Initially: <<ls -l -s &>>
    Loop body: <<ls>>
    Loop body: <<-l>>
    Loop body: <<-s>>
    Post loop: <<&>>
    Initially: <<ls &>>
    Loop body: <<ls>>
    Post loop: <<&>>
    Initially: <<&>>
    Post loop: <<&>>
    Initially: << >>
    Initially: <<>>

    请注意在最后两个示例中标记如何为自己付费。没有标记,你无法区分这些。

    关于c - 如何使用 strtok(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18927793/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com