Структура получает ненужные значения при выходе из функции - PullRequest
0 голосов
/ 31 октября 2019

Программа должна взять предложение и разбить его на отдельные слова (домашнее задание). Данные правильно хранятся для структурирования в функции «read_data» (см. В отладчике), после выхода из основного списка члены в структуре получили ненужные значения,что идет не так? код на языке c. заранее спасибо.

//-----------------------------StructSection-------------------------------
struct Sentences
{
    char** _data;
    int _num_of_sentences;
};
//-----------------------------MainFunction------------------------------------
int main()
{
    struct Sentences sen; //structure storage
    char str[SIZE] = {0}; // string storage array

    read_data(sen,str); //call read data function
    copy_n_print_data(sen,str);
    free_data(sen); // call free memory function

    return EXIT_SUCCESS;
}
//-----------------------------ReadDataFunction--------------------------------
void read_data(struct Sentences sen,char str[SIZE]) // main function
{
    int c;

    scanf("%d", &c);
    sen._num_of_sentences = c;

    sen._data = (char**) malloc (c * sizeof (char*));
    if(sen._data == NULL) //if not enough memory then call error function
        terminate();

    fgets(str, SIZE, stdin); //get string
    scanf ("%[^\n]%*c", str);
}

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Проблема в том, что sen у вас в read_data на самом деле не тот же, что у вас в main - это просто копия. Тот, который у вас есть в main, остается неизменным по сравнению с его первоначальным значением - что на самом деле означает, что он состоит из ненужных значений. Очень простой способ исправить это - изменить read_data таким образом, чтобы вместо Sentences в качестве значения он создавал Sentences и возвращал его - тогда main может просто использовать то, что возвращает read_data. Это выглядело бы так:

struct Sentences read_data(char str[SIZE]) // main function
{
    struct Sentences sen;
    int c;

    scanf("%d", &c);
    sen._num_of_sentences = c;

    sen._data = (char**) malloc (c * sizeof (char*));
    if(sen._data == NULL) //if not enough memory then call error function
        terminate();

    fgets(str, SIZE, stdin); //get string
    scanf ("%[^\n]%*c", str);
    return sen;
}

int main()
{
    struct Sentences sen; //structure storage
    char str[SIZE] = {0}; // string storage array

    sen = read_data(str); //call read data function
    copy_n_print_data(sen,str);
    free_data(sen); // call free memory function

    return EXIT_SUCCESS;
}

Другая вещь, которую вы могли бы сделать, это вместо этого передать ее через указатель, убедившись, что вы фактически манипулируете одним и тем же struct Sentences в обеих функциях:

void read_data(struct Sentences* sen,char str[SIZE]) // main function
{
    int c;

    scanf("%d", &c);
    sen->_num_of_sentences = c;

    sen->_data = (char**) malloc (c * sizeof (char*));
    if(sen->_data == NULL) //if not enough memory then call error function
        terminate();

    fgets(str, SIZE, stdin); //get string
    scanf ("%[^\n]%*c", str);
}
int main()
{
    struct Sentences sen; //structure storage
    char str[SIZE] = {0}; // string storage array

    read_data(&sen,str); //call read data function
    copy_n_print_data(sen,str);
    free_data(sen); // call free memory function

    return EXIT_SUCCESS;
}
0 голосов
/ 31 октября 2019

Ваша read_data функция принимает аргументы по значению (копия). Изменение аргументов (копий) не действует вне функции, поэтому после вызова вы просто печатаете неинициализированные переменные (что, кстати, является неопределенным поведением).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...