关于结构数组的数据结构

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(&amp;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。所以忽略这些建议

以上是关于关于结构数组的数据结构的主要内容,如果未能解决你的问题,请参考以下文章

关于柔性数组的一些问题

看得见的数据结构——关于数组表,你真的懂吗?

关于C中的结构,如何将数据从结构复制到字符串数组

常见的关于数组的数据结构

关于定义结构体指针数组

【数据结构】数据类型分为原子型和结构型,关于结构型的问题?