使用 strtok 将字符串拆分为标记的问题 - 拆分后字符数组为空

Problem with splitting string into tokens with strtok - Char arrays are empty after splitting

我是 C 语言编程的新手,最近几天我一直在努力解决一个问题,但现在我不知道该怎么做。

我正在读取一个带有函数 "input" 的字符串,每当出现白色 space 时,它就会被拆分成多个部分。这些部分存储在 char 数组中,到目前为止工作正常。 但是,当我在 main 中调用下一个函数 "checkInput" 时,char 数组再次为空。我需要更改什么,以便在调用下一个函数时 char 数组不为空?

当我使用 scanf 而不是 fgets 时,它起作用了。但是为什么?

如有任何帮助,我们将不胜感激。

void input(char* string1, char* string2, char* string3)                     
{
    char ptr[100];

    printf("Enter String: \n");
    fgets(ptr, 100, stdin);
    printf("%s \n", ptr);

    if(ptr != NULL)
    {
        string1 = strtok(ptr, " \n");
        printf("string1: %s \n", string1);
    }
    if(ptr != NULL)
    {
        string2 = strtok(NULL, " \n");
        printf("string2: %s \n", string2);
    }
    if(ptr != NULL)
    {
        string3 = strtok(NULL, " \n [=10=]");
        printf("string3: %s \n", string3);
    }
}

int main(void)
{

    char string1[100];
    char string2[100];
    char string3[100];
    input(string1, string2, string3);
    checkInput(string1, string2, string3);
    return 0;
}

由于您将 main() 中的 string1, string2, string3 声明为每个 100 个字符的数组,每个字符具有 自动存储持续时间 ,因此已经为 中的数组提供了存储=13=]。要使 main() 中的字符串恢复并避免 input()ptr 的存储问题在 return 上变得无效,最简单的方法就是 strcpy input() 中字符串的标记,例如

void input(char* string1, char* string2, char* string3)                     
{
    char ptr[100], *p = ptr;

    printf ("Enter String: \n");
    fgets (p, 100, stdin);
    printf("%s \n", ptr);

    if (p != NULL)
    {
        p = strtok (p, " \n");
        if (p)
            strcpy (string1, p);
        printf("string1: %s \n", string1);
    }
    if (p != NULL)
    {
        p = strtok (NULL, " \n");
        if (p)
            strcpy (string2, p);
        printf("string2: %s \n", string2);
    }
    if (p != NULL)
    {
        p = strtok (NULL, " \n [=10=]");
        if (p)
            strcpy (string3, p);
        printf("string3: %s \n", string3);
    }
}

现在 string1, string2string3 将保持有效,直到您退出 main() 并且您的程序结束。