如何为结构数组赋值
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++ 中,titolo
和 autore
是 string
s 而不是数组,在这种情况下,性能会有所不同,因为表示不会与原始数组相同。性能是更好还是更差取决于确切的程序数据。由于更紧凑的表示(小字符串优化),性能可能会更好,或者如果字符串数据太大而最终会分配大量内存,则性能可能会更慢。
这是一个演示程序,展示了如何在数组声明期间设置数组元素,并在数组声明后使用函数 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
我收到这个错误:
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++ 中,titolo
和 autore
是 string
s 而不是数组,在这种情况下,性能会有所不同,因为表示不会与原始数组相同。性能是更好还是更差取决于确切的程序数据。由于更紧凑的表示(小字符串优化),性能可能会更好,或者如果字符串数据太大而最终会分配大量内存,则性能可能会更慢。
这是一个演示程序,展示了如何在数组声明期间设置数组元素,并在数组声明后使用函数 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