首页 > 解决方案 > 在结构中分配字符串指针

问题描述

我正在学习 C 并且遇到了麻烦。它确实编译但结果出乎意料。在我的代码中,我有一个结构:

typedef struct {
    char *title[50];
    float price;
} Book;

主要是,我问用户他们想在图书馆里有多少本书。然后让他们初始化每本书的属性。Display最后,使用函数将它们打印到终端。

void Display(Book* lib, int n);

int main() {
    int n;
    printf("Enter the number of books:\n" );
    scanf("%d", &n);
    if(n <= 0) {
        printf("Invalid number of book.");
        return 1;
    }

    Book *lib = (Book *) malloc(n * sizeof(Book));
    if(lib == NULL) {
        printf("The memory is full");
        return 1;
    }

    for(int i = 0; i < n; ++i) {
        char title[50];
        float price;
        printf("Book no.%d\n", i);
        printf("Book Title: ");
        scanf("%s", title);
        printf("Book Price: ");
        scanf("%f", &price);
        printf("\n");
        *(lib+i)->title = title;
        (lib+i)->price = price;
    }

    Display(lib, n);

    return 0;
}

代码编译成功,但是结果是这样的:

Enter the number of books:
2
Book no.0
Book Title: AAAA
Book Price: 1.0

Book no.1
Book Title: BBBB
Book Price: 9.9


----Displaying----
Book no.0
Book Title: BBBB
Book Price: $1.000000

Book no.1
Book Title: BBBB
Book Price: $9.900000

第一本书的书名不对,是第二本书的书名。为什么会这样?我应该如何解决它?谢谢

编辑:我的作业中的要求之一是标题Book必须是类型char*

编辑 2:当我现在有 50 个 char 类型的指针时,我意识到了我的错误。我应该如何解决它?

标签: cpointersstruct

解决方案


在您的结构定义中:

typedef struct {
    char *title[50];
    float price;
} Book;

你没有一个数组char(可以保存一个字符串),而是一个指针数组,char每个指针都可以指向一个字符串。

此外,由于成员的定义,这不会达到您的预期price

*(lib+i)->title = title;

将定义更改为:

typedef struct {
    char title[50];
    float price;
} Book;

并直接读入结构字段而不是临时变量以避免复制:

    printf("Book Title: ");
    scanf("%s", lib[i].title);
    printf("Book Price: ");
    scanf("%f", &lib[i].price);

或者,您可以定义titlechar *

typedef struct {
    char *title;
    float price;
} Book;

在这种情况下,您必须为指向的指针分配空间:

    lib[i].title = malloc(50);
    printf("Book Title: ");
    scanf("%s", lib[i].title);

请注意,您不能像以前那样让它指向本地,因为本地在循环结束时超出范围,使指针无效。


推荐阅读