C 使用strtok将字符串拆分为令牌时出现问题-拆分后字符数组为空

C 使用strtok将字符串拆分为令牌时出现问题-拆分后字符数组为空,c,arrays,string,fgets,strtok,C,Arrays,String,Fgets,Strtok,我对C语言编程很陌生,我有一个问题,我在过去的几天里一直试图解决这个问题,但现在我不知道该怎么办 我用函数“input”读取一个字符串,每当有空格时,该函数就会被拆分成几个部分。这些部件存储在字符数组中,到目前为止效果良好。 但是,当我在main中调用下一个函数“checkInput”时,char数组再次为空。调用下一个函数时,我必须更改什么,以使字符数组不为空 当我使用scanf而不是fgets时,它起了作用。但是为什么呢 任何帮助都将不胜感激 void input(char* string1

我对C语言编程很陌生,我有一个问题,我在过去的几天里一直试图解决这个问题,但现在我不知道该怎么办

我用函数“input”读取一个字符串,每当有空格时,该函数就会被拆分成几个部分。这些部件存储在字符数组中,到目前为止效果良好。 但是,当我在main中调用下一个函数“checkInput”时,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 \0");
        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个字符的数组,每个字符具有自动存储持续时间,因此已为
input()
中的数组提供了存储。要将字符串返回到
main()
中并避免
input()
中的
ptr
存储在
input()中变得无效,最简单的方法就是在
input()
中对字符串进行
strcpy
标记,例如

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 \0");
        if (p)
            strcpy (string3, p);
        printf("string3: %s \n", string3);
    }
}

现在
string1、string2和
string3将保持有效,直到退出
main()
并且程序结束。

您的意思是我必须通过引用传递字符数组吗?像
void输入(char**string1,char**string2,char string3**)
?我们需要在
inputCheck()
中使用的函数的正确定义,比如f.e.
IsOperator()
。我发现了一些参考文献,但它们似乎是针对C++的,而不是针对C.@ FR U.chtTeNoY的。如果你想“ping”一个不是OP的用户,你需要在你的评论前面设置<代码> @用户名< /代码>。@ Yunnosch哪些参数是错误的?特别是发生在<代码> Char PTR(100);<代码>当
input()
返回时?(提示:
ptr
input()
函数的函数堆栈的一部分,返回时会被销毁(释放以供再次使用)。由于
strtok
将在
ptr
中返回一个地址到每个令牌的开头,因此字符串将指向函数返回后不再有效的内存。如果使用了
scanf(“%99[^\n]”,ptr)而不是
fgets(ptr,100,标准输入)