c - 在结构中分配字符串指针
问题描述
我正在学习 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 类型的指针时,我意识到了我的错误。我应该如何解决它?
解决方案
在您的结构定义中:
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);
或者,您可以定义title
为char *
:
typedef struct {
char *title;
float price;
} Book;
在这种情况下,您必须为指向的指针分配空间:
lib[i].title = malloc(50);
printf("Book Title: ");
scanf("%s", lib[i].title);
请注意,您不能像以前那样让它指向本地,因为本地在循环结束时超出范围,使指针无效。
推荐阅读
- r - Rstudio- 删除依赖 rJava 和 xlsx
- asp.net-core - ASP.NET 核心 3.1:将类库添加到 Project_MissingMethodException:找不到方法:'Boolean Microsoft.EntityFrameworkCore.Migrations
- python - 用另一列内的列名重塑数据框
- matlab - 在 MATLAB 中移动最大值和 LTI
- c# - 在运行时添加控件时出现问题(C# Windows 窗体)
- css - 理解 CSS 变换中的缩放后翻译
- android-studio - 像在 Android Studio 中一样在 vscode 中颤动代码格式
- c - 如何在C中检查指针的值
- javascript - Javascript getUserMedia 在 iphone safari 中首次加载时显示黑屏
- node.js - 使用 Axios 发送请求时出现“连接 ECONNREFUSED”错误