关于结构数组的数据结构
Posted
技术标签:
【中文标题】关于结构数组的数据结构【英文标题】:Data Structure about struct array 【发布时间】:2018-03-12 15:04:16 【问题描述】:最近,我学习了一个叫做数据结构的主题。我创建了一个程序来尝试我的知识,但不知道为什么该程序不起作用。我想不通,所以我把它贴在这里寻求解决方案。我希望人们能帮助我。我是这里的新手。因此,如果我的意见令人讨厌,请忽略我的意见。
#include <stdio.h>
int main()
struct Book
char title[50];
int year;
float price;
;
int i;
struct Book books[50];
books[0].title="Bullshit";
books[0].year=132;
books[0].price=146.9;
books[1]=(struct Book)"Money",1344,189.4
;
for(i=0;i<2;i++)
printf("Book Title is : %s\n",books[i].title);
printf("Book Year is %d\n",books[i].year);
printf("Book price is %3.2f\n",books[i].price);
printf("\n\n");
【问题讨论】:
13 16 D:\data structure code\Module self check 2.6.c [Error] assignment to expression with array type 请edit 包含所有相关数据(例如编译错误)的问题,而不是将它们添加到 cmets 中。books[0].title="Bullshit";
真的吗?
应该是strcpy(&books[0].title[0], "Bullshit");
如果要使用赋值,切换到std::string
。
books[1] = "Money",1344,189.4f;
你可以直接初始化这个
【参考方案1】:
1 我会在 main 之外而不是在内部声明 struct
2 尝试将char title[50]
更改为char *title
#include <stdio.h>
struct Book
char *title;
int year;
float price;
;
int main()
int i;
struct Book books[50];
books[0].title = "Bullshit";
books[0].year = 132;
books[0].price = 146.9;
books[1] = (struct Book) "Money", 1344, 189.4
;
for (i = 0; i < 2; i++)
printf("Book Title is : %s\n", books[i].title);
printf("Book Year is %d\n", books[i].year);
printf("Book price is %3.2f\n", books[i].price);
printf("\n\n");
为什么它以前不起作用?
在 c 中,=
运算符不能分配数组。
你可以改为title[0] = 'B'; title[1] = 'u', etc...
.(or use strcpy which does it for you
)。
char *x
并不是真正的数组,它只是指向单个字符的指针。
如果我们写x = "abc"
,我们是在告诉编译器:将 x 设置为 'a',下一个字节设置为 'b',设置为 'c' 和 0(不是 '0',只是零)。
当你执行printf("%s",x)
时,printf
函数会从 x 指定的内存位置打印字符,直到它看到 0 字节。
char *x = "abcd";
char *y = x;
while(*y != 0) // this loop acts like printf("%s",x);
printf("%c",*y);
y++;
另请参阅this 和this 问题。
或者,如果您使用的是 c++,而不是 c,请使用 std::string:
#include <cstdio>
#include <string>
struct Book
std::string title;
int year;
float price;
Book(std::string t, int y, float p)
title = t;
year = y;
price = p;
;
int main()
int i;
Book books[50];
books[0].title = "Bullshit";
books[0].year = 132;
books[0].price = 146.9;
books[1] = Book(std::string("Money"), 1344, 189.4);
for (i = 0; i < 2; i++)
printf("Book Title is : %s\n", books[i].title.c_str());
printf("Book Year is %d\n", books[i].year);
printf("Book price is %3.2f\n", books[i].price);
printf("\n\n");
【讨论】:
如果您建议更改title
数据结构,推荐std::string
。
另外,OP 可以使用strncpy
而不是赋值或将数组更改为指针。
@ThomasMatthews 是的,当然是 std::string,但是这家伙是用 c 编写的,而不是 c++(嗯……他没有提供任何有关它的信息,但他的代码更像c代码比c ++,这就是为什么我没有使用std::string)
@JK 好吧,如果他用 C 编写,那么问题将被标记为 C,而不是 C++。
@AlgirdasPreidžius 原始问题没有任何关于语言的标签,此标签已通过编辑添加。【参考方案2】:
这个
books[0].title="Bullshit";
无效。标题定义为char[50]
。要么做
strcpy(books[0].title, "BS");
这会将 BS 的字节复制到标题。或者做
struct Book
char *title;
int year;
float price;
;
...
books[0].title = strdup("BS");
这会将 title 设置为指向 char 字符串的指针。 strdup 将为字符串分配空间并将 BS 复制到该空间。您必须释放分配的空间。
或者 - 最好的。使用 std::string
struct Book
std::string title;
int year;
float price;
;
....
books[0].title = "BS";
作为最后的想法 - 使用 std::vector 而不是原始数组会更好
【讨论】:
“作为最后的想法 - 使用 std::vector 而不是原始数组让生活变得更好” - 100% 同意 ;) std::vector 和 std::string 是 C++ 的东西。我看到标签已更改为 c。所以忽略这些建议以上是关于关于结构数组的数据结构的主要内容,如果未能解决你的问题,请参考以下文章