ОШИБКА: функция не может вернуть тип символа в C - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь сделать ADT, но когда я создал функцию, которая возвращает тип символа, программа не работает.Это ADT:

typedef struct{
int ID;
char Writer[100];
char Title[100];
long Year;
}Book;

функция:

char GetTitle(Book B){
return B.Title;
}

Я использовал это, чтобы получить возвращаемое значение функции:

printf("%s",GetTitle(B));

Как сделатьЯ возвращаю тип Char?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вы обязательно должны прочитать предупреждения, переданные компилятором: наверняка он говорит, что вы не можете вернуть адрес из стека функции.Это работает случайно, так как эта память недействительна после возврата функции.Вы должны продолжить использовать указатели и ссылки.Попробуйте изменить char GetTitle(Book B); на char* GetTitle(Book *B);, например:

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

typedef struct {
    int ID;
    char Writer[100];
    char Title[100];
    long Year;
} Book;

char* GetTitle(Book *B) {
    return B->Title;
}

int main() {
    Book B;
    strcpy(B.Title, "Title");
    printf("%s\n", GetTitle(&B));
    return 0;
}
0 голосов
/ 05 октября 2018

Вы возвращаете символ * вместо

char* GetTitle(Book *B){
    return B->Title;
}

Обратите внимание, что это просто возвращает указатель на название книги.Поэтому, когда книга уничтожена, указатель становится недействительным.Вы не можете вернуть весь заголовок, так как вы не можете вернуть массив.Если вы хотите сделать копию строки после того, как вы получили указатель (чтобы она оставалась действительной после уничтожения книги), используйте strdup:

Book* B = malloc(sizeof(Book));
// [...] initialize the book...
char *title = strdup(GetTitle(B));
free(B);
printf("%s",title);
free(title);

Редактировать: если strdup недоступно,проверьте этот ответ для реализации.

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