如何为结构数组赋值

时间:2015-01-07 19:44:50

标签: c arrays struct typedef

我收到此错误:

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;
}

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

3 个答案:

答案 0 :(得分:2)

在C99中您可以使用指定的初始值设定项:

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

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

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


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

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

答案 1 :(得分:1)

这是一个演示程序,演示如何在声明期间设置数组元素,并在使用函数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

考虑到数组没有赋值运算符。您必须复制数组元素。例如,对于包含字符串的字符数组,您可以使用标题strcpy中声明的标准函数<string.h>

答案 2 :(得分: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");

note :{&#34; strings.h&#34;中声明了strcpy功能。标题,以及其他字符串处理函数。