Проблема с разделением строки на токены с помощью strtok - Массивы Char после разделения - PullRequest
2 голосов
/ 08 февраля 2020

Я довольно новичок в программировании на C, и у меня есть проблема, которую я пытался решить в последние дни, но сейчас я нахожусь в точке, где я не знаю, что делать.

Я читаю строку с функцией «input», которая затем разбивается на части каждый раз, когда появляется пробел. Части хранятся в массивах символов, которые пока работают нормально. Однако, когда я вызываю следующую функцию «checkInput» в main, массивы 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;
}

1 Ответ

1 голос
/ 08 февраля 2020

Поскольку вы объявляете string1, string2, string3 в main() как массивы по 100 символов каждый с automati c длительность хранения , хранилище уже предоставлено для массивов в input(). Самый простой способ вернуть строки обратно в main() и избежать проблемы, связанной с тем, что ptr in 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, string2 и string3 будут действовать до тех пор, пока вы не закроете main() и ваша программа не закончится.

...