C 如何使用strtok()

C 如何使用strtok(),c,printf,token,strtok,C,Printf,Token,Strtok,我正在编写一个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

我正在编写一个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;
}
但是我希望它在第二个
printf
语句中打印
&
。我该怎么做?我的家庭作业需要这个部分

  • 确保在打印时能够识别打印内容的限制
  • 在打印消息的末尾输出换行符;如果您这样做,信息更有可能及时出现
  • 不要将空指针打印为字符串;并非所有版本的
    printf()
    都能正常运行,其中一些版本会转储内核
  • 代码:

    输出相同


    修订要求 我想在
    之外添加
    printf()
    语句,而在
    之外循环并打印“
    &
    ”。我需要它,因为我想稍后将它与程序中的另一个变量进行比较。有什么办法吗

    是的,通常有一种方法可以做任何事情。这似乎奏效了。如果有更多的令牌要解析,或者只有
    &
    要解析,或者没有令牌,它也可以正常工作。很明显,如果你愿意的话,外环的主体可以变成一个函数;即便如此,这样做也是明智的

    #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;
    }
    
    #包括
    #包括
    内部主(空)
    {
    字符测试[][16]=
    {
    “ls-l-s&”,
    “ls&”,
    "&",
    "    ",
    ""
    };
    对于(size_t i=0;i
    输出:

    <<ls>>
    <<&>>
    
    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: <<>>
    
    最初:
    环体:
    环体:
    环体:
    后循环:
    最初:
    环体:
    后循环:
    最初:
    后循环:
    最初:>
    最初:
    

    请注意,在最后两个示例中,标记是如何为自己付费的。如果没有记号笔,你就无法把它们区分开来。

    你应该这样写:

    #include<stdio.h>
    #include<string.h>
    
    int main();
    {
    char string[] = "ls &"; //you should not write 100, cuz you waste memory
    char *pointer;
    
    pointer = strtok(string, " "); //skip only spaces
    while(pointer != NULL)
       {
          printf("%s\n", pointer);
          pointer = strtok(string, " ");
       }
    return 0;
    }
    
    #包括
    #包括
    int main();
    {
    char string[]=“ls&”;//您不应该写入100,因为这样会浪费内存
    字符*指针;
    指针=strtok(字符串,“”;//只跳过空格
    while(指针!=NULL)
    {
    printf(“%s\n”,指针);
    指针=strtok(字符串“”);
    }
    返回0;
    }
    
    你的
    while
    循环一直持续到
    tok
    NULL
    ,对吗?因此,在第二个
    printf
    语句中,
    tok
    NULL
    。这令人惊讶吗?在第一个printf()中添加一个换行符,如果您需要有关
    strtok()
    的帮助,您可以随时使用。@rici是的,它正在打印NULL。如何让它改为打印“&”@user2201650:您认为循环执行了多少次?您认为它第一次打印什么?我想在while循环外添加printf语句,并在while循环外打印“&”。我需要它,因为我想稍后将它与程序中的另一个变量进行比较。有什么办法吗?嗯,我想你能做到;大多数事情都可以做到。你确定值得吗?给我几分钟,让我想想。这不是…一个明显的要求…我们应该说。@JonathanLeffler或没有额外的变量和strtok@self。我只是看着你粘贴的代码;你说得对,它可以变得更光滑。我过去也曾这样做过;这次我忘了。在第一次调用
    strtok()
    之后,必须使用
    NULL
    作为第一个参数,以指示您在上一次调用停止的地方继续。此代码有缺陷,您应该将while循环中的strtok first值替换为NULL
    #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;
    }
    
    #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: <<>>
    
    #include<stdio.h>
    #include<string.h>
    
    int main();
    {
    char string[] = "ls &"; //you should not write 100, cuz you waste memory
    char *pointer;
    
    pointer = strtok(string, " "); //skip only spaces
    while(pointer != NULL)
       {
          printf("%s\n", pointer);
          pointer = strtok(string, " ");
       }
    return 0;
    }