strcpy后用字符串打印的垃圾

问题描述 投票:0回答:2

我是 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
,但我更喜欢之前修复代码。

c struct strcpy garbage
2个回答
1
投票
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;
}

https://godbolt.org/z/13j31hGeG


1
投票

问题是您声明了一个结构,其中包含一个名为

estado

的灵活数组成员
typedef struct {
    float mort_2009, mort_2015, indices;
    char estado[];
} Mortalidade

它有一个不完整的字符数组类型。

您需要为数据成员连同结构类型的对象分配内存,或者指定数组的固定大小,或者将数据成员声明为

char *
类型的指针并为存储的字符串分配内存。

最简单的方法就是tp声明数据成员

estado
喜欢

    char estado[3];

足以存储您的字符串文字。

© www.soinside.com 2019 - 2024. All rights reserved.