使用strtok将字符串拆分为令牌的问题-拆分后,Char数组为空

问题描述 投票:1回答:1

我对使用C语言进行编程还很陌生,但是我一直试图解决最后一个问题,但是现在我不知道该怎么做。

我正在读取带有“输入”功能的字符串,每当有空格时,该字符串都会分成几部分。这些部分存储在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 \0");
        printf("string3: %s \n", string3);
    }
}

int checkInput(char* string1, char* string2, char* string3)     
{
    if(isExponentiation(string1))
    {
        return TRUE;
    }
    else if(isSqrt(string1) && isNumber(string2))
    {
        return TRUE;
    }
    else if(isOperator(string1) && isNumber(string2) && isNumber(string3))
    {
        return TRUE;
    }
    else if(isOperator(string2) && isNumber(string1) && isNumber(string1))
    {
        return TRUE;
    }
    else if(isOperator(string3) && isNumber(string1) && isNumber(string2))
    {
        return TRUE;
    }
    else return FALSE;

}

int main(void)
{
    while(1)
    {   
        char string1[100];
        char string2[100];
        char string3[100];
        input(string1, string2, string3);
        if(checkInput(string1, string2, string3))
        {
            double out = calculate(string1, string2, string3);
            output(string1, string2, string3, out);
        }
        else 
        {   
            printf("Error! \n \n");
        }

    }
    return 0;
}

c arrays string fgets strtok
1个回答
1
投票

由于您在string1, string2, string3中将main()声明为100个字符的数组,每个数组具有自动存储持续时间,因此已经为input()中的数组提供了存储。要使字符串返回main()并避免ptr中的input()的存储在返回时变为无效的问题,最简单的方法就是将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 \0");
        if (p)
            strcpy (string3, p);
        printf("string3: %s \n", string3);
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.