我是 C 的初学者,我正在尝试将一个字符串复制到另一个字符串中。我有以下代码:
#include <stdio.h>
#include <string.h>
typedef struct {
float mort_2009, mort_2015, indices;
char estado[];
} Mortalidade;
void defineEstados (
Mortalidade *e,
char estado[],
float mort_2009,
float mort_2015,
int posix)
{
strcpy(e[posix].estado, estado);
e[posix].mort_2009 = mort_2009;
e[posix].mort_2015 = mort_2015;
e[posix].indice = mort_2009 / mort_2015;
}
void imprimeEstados (Mortalidade *e){
for (int i = 0; i < 3; i++){
printf("Estado: %s, Morte em 2009: %.1f, Morte em 2015: %.1f, Indice: %.2f \n",
e[i].estado,
e[i].mort_2009,
e[i].mort_2015,
e[i].indice);
}
}
int main() {
Mortalidade estados[27];
defineEstados(estados, "AC", 12.6, 10.6, 0);
defineEstados(estados, "AL", 12.6, 10.6, 1);
defineEstados(estados, "AP", 12.6, 10.6, 2);
imprimeEstados(estados);
return 0;
}
我的结构
Mortalidade
有一个名为 estado
的字段,它将在 void 函数 defineEstados
中接收一个字符串(和其他数据)。因此,在使用 strcpy
复制结构内的字符串后,在 void 函数 imprimeEstados
中,当我想在我的结构内打印 estados
时,结果看起来像变量内的垃圾,我不知道如何找到错误。这是获得的输出:
Estado: ��IA��)A�&�?��IA��)A�&�?AP, Morte em 2009: 12.6, Morte em 2015: 10.6, Indice: 1.19
Estado: ��IA��)A�&�?AP, Morte em 2009: 12.6, Morte em 2015: 10.6, Indice: 1.19
Estado: AP, Morte em 2009: 12.6, Morte em 2015: 10.6, Indice: 1.19
个人感觉是垃圾串连,不知道怎么解决
注意:我假装插入更多
estados
,但我更喜欢之前修复代码。
typedef struct {
float mort_2009, mort_2015, indices;
char estado[];
} Mortalidade;
estado
是长度为零 (0) 的灵活数组成员。你不能像在程序中那样使用这个结构,因为静态分配不会为它分配任何内存。
这种结构旨在与动态分配一起使用。
typedef struct {
float mort_2009, mort_2015, indices;
char estado[];
} Mortalidade;
void defineEstados (
Mortalidade **e,
char estado[],
float mort_2009,
float mort_2015,
int posix)
{
e[posix] = malloc(sizeof(**e) + strlen(estado) + 1);
if(e[posix])
{
strcpy(e[posix] -> estado, estado);
e[posix] -> mort_2009 = mort_2009;
e[posix] -> mort_2015 = mort_2015;
e[posix] -> indices = mort_2009 / mort_2015;
}
}
void imprimeEstados (Mortalidade **e){
for (int i = 0; i < 3; i++){
if(e[i]) printf("Estado: %s, Morte em 2009: %.1f, Morte em 2015: %.1f, Indice: %.2f \n",
e[i] -> estado,
e[i] -> mort_2009,
e[i] -> mort_2015,
e[i] -> indices);
}
}
int main() {
Mortalidade *estados[27];
defineEstados(estados, "AC", 12.6, 10.6, 0);
defineEstados(estados, "AL", 12.6, 10.6, 1);
defineEstados(estados, "AP", 12.6, 10.6, 2);
imprimeEstados(estados);
//free memory
return 0;
}
问题是您声明了一个结构,其中包含一个名为
estado
的灵活数组成员
typedef struct {
float mort_2009, mort_2015, indices;
char estado[];
} Mortalidade
它有一个不完整的字符数组类型。
您需要为数据成员连同结构类型的对象分配内存,或者指定数组的固定大小,或者将数据成员声明为
char *
类型的指针并为存储的字符串分配内存。
最简单的方法就是tp声明数据成员
estado
喜欢
char estado[3];
足以存储您的字符串文字。