如何为结构数组赋值

How to assign a value to a struct array

我收到这个错误:

incompatible types when assigning to type ‘char[100]’ from type ‘char *’

当我尝试编译时:

struct libro {
    char titolo[100];
    char autore[50];
    int anno_pubblicazione;
    float prezzo;
};
typedef struct libro Libri;

int main (void) {
    Libri scaffale[150];

    scaffale[1].titolo = "last of mohicans";
    printf("\n%s\n",scaffale[1].titolo);

    return 0;
}

我想知道如何为数组指定成员的特定字段赋值。

你不能在 c 中给数组赋值,试着改变这个

scaffale[1].titolo = "last of mohicans";

strcpy(scaffale[1].titolo, "last of mohicans");

您需要将文字复制到数组中。

此外,c 中数组的第一个元素的索引为 0 而不是 1,因此要填充数组的第一个元素,您需要

strcpy(scaffale[0].titolo, "last of mohicans");

注意strcpy函数在"strings.h"header以及其他字符串处理函数中声明。

在 C99 中你可以使用指定的初始化器:

Libri scaffale[150] = { [1] = {"last of mohicans"} };

您的代码存在的问题是数组不可赋值。数组可以初始化,初始化使用的语法看起来类似于赋值,但它们不是一回事。

如果您确实需要赋值,那么您必须在 C 中做的是编写一个循环来分配数组的各个元素。或者使用一个预先存在的函数来执行此操作,如果数组类型是这样的,则可以使用这样的函数。对于空终止的 char 数组,有这样一个函数,称为 strcpy.


虽然 C++ 继承了 C 的所有原始数组的兼容性问题,但在 C++ 中,您可以使用 std::array 来获得具有更合理行为的数组:它们是可复制的,可分配的,使用按值传递语法实际上是这样做的,而不是插入一些奇怪的转换到指向数组第一个元素的指针等。而且 C++ std::array 类型与原始数组相比具有零开销:std::array 将导致相同的对象布局和代码生成作为原始数组。合理的数组类型的可用性是使用 C++ 而不是 C 的一个很好的理由。

当然,在这种情况下,很可能在 C++ 中,titoloautorestrings 而不是数组,在这种情况下,性能会有所不同,因为表示不会与原始数组相同。性能是更好还是更差取决于确切的程序数据。由于更紧凑的表示(小字符串优化),性能可能会更好,或者如果字符串数据太大而最终会分配大量内存,则性能可能会更慢。

这是一个演示程序,展示了如何在数组声明期间设置数组元素,并在数组声明后使用函数 strcpy

分配元素
#include <stdio.h>
#include <string.h>

struct libro 
{
    char titolo[100];
    char autore[50];
    int anno_pubblicazione;
    float prezzo;
} ;

typedef struct libro Libri;



int main(void) 
{
    Libri scaffale[150] = { [1].titolo = "last of mohicans" };

    puts( scaffale[1].titolo );

    strcpy( scaffale[0].titolo, "first of mohicans" );  

    puts( scaffale[0].titolo );

    return 0;
}

输出为

last of mohicans
first of mohicans

考虑到数组没有赋值运算符。您必须复制数组的元素。例如,对于包含字符串的字符数组,您可以使用在 header <string.h>.

中声明的标准函数 strcpy