Возвращаемое значение fgets в основную функцию - PullRequest
1 голос
/ 05 мая 2020

Функция fWord запрашивает мой ввод и должна вернуть первое встреченное слово (до первого пробела). Он работает в Online Visual Studio, но если я попытаюсь скомпилировать его с помощью codeBlocks, мой ввод не будет распечатан.

#include <stdio.h>
#include <string.h>
#include <ctype.h>

char * fWord();
char * test;

int main()
{
    test = fWord();
    printf("%s\n", test);

    return 0;
}

char * fWord() // ONLY READ THE FIRST WORD
{
    char buffer[20];
    char * input = buffer;

    fgets(input, sizeof(input), stdin);
    input = strtok(input, " ");
    input[strcspn(input, "\r\n")] = 0; // REMOVES NEWLINE FROM GETLINE

    return input;
}

1 Ответ

2 голосов
/ 05 мая 2020

Буфер

char buffer[20];

имеет локальное хранилище. Он выделяется в стеке и освобождается, как только возвращается fWord.

Вам необходимо выделить его извне (либо как глобальную переменную, либо как локальную переменную функции main, передавая ее как новую параметр fWord) или продолжайте выделение в пределах fWord, но динамически (используя malloc ()).

Кроме того, как правильно заметил @lurker в разделе комментариев, вызов

fgets(input, sizeof(input), stdin);

указывает fgets() читать не более sizeof(input) символов. Но на самом деле это будет размер char * указателя, 4 или 8, в зависимости от вашей архитектуры.

В итоге ваша программа станет:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAX_INPUT_LEN 20

char * fWord(void);

int main(void)
{
    char *test = fWord();
    if (test) //fWord might return a NULL pointer 
    {
        printf("%s\n", test);
        free(test);
    }
    return 0;
}

char * fWord(void) // ONLY READ THE FIRST WORD
{
    char * input = malloc(MAX_INPUT_LEN);
    if (input)
    {
        fgets(input, MAX_INPUT_LEN, stdin);
        input[strcspn(input, "\r\n")] = 0; // REMOVES NEWLINE FROM GETLINE
        input = strtok(input, " ");
    }
    return input;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...