If não retorna o valor de char[RESOLVIDO]

criei uma struct ela funciona normal no codigo exceto quando uso o If
dentro do “if” os valores de int retornam mas o char retornando vazio

segue a parte do codigo:

if (Player.class_play == 1){
    Player.class_player[20] = "GUERREIRO";
    printf("Você escolheu a classe GUERREIROS atribua os pontos de habilidade %d\n", Player.skills);


    do{
        printf("digite os pontos de força, destreza e armadura respectivamente: ");
        scanf("%d %d %d", &_class.warrior.force, &_class.warrior.dexterity, &_class.warrior.armor);

    }while(_class.warrior.force+_class.warrior.dexterity+_class.warrior.armor>5);
    Player.skills = 0;
}
else{
    Player.class_player[20] = "MAGO";
    printf("Você escolheu a classe MAGO atribua os pontos de habilidade %d\n", Player.skills);


    do{
        printf("digite os pontos de habilidade, armadura e magia respectivamente: ");
        scanf("%d %d %d", &_class.mage.ability, &_class.mage.armor, &_class.mage.magic);

    }while(_class.mage.ability+_class.mage.armor+_class.mage.magic>5);
    Player.skills = 0;
}

a variavel
Player.class_player[20];

Não quer retornar Mago ou Guerreiro

sempre retornam um valor vazio na função principal

saida da função

printf("+ Classe: %s        \n", Player.class_player);

retorna
+ Classe:

Vc está fazendo errado. Sua tentativa de atribuir “GUERREIRO” é equivalente a isso:

char classe[20];          // declaração
classe[20] = "GUERREIRO"; // atribuição
puts(classe);

E vai gerar um resultado indeterminado. Até é possível fazer esse tipo de coisa, mas só quando vc está declarando a variável, assim:

char classe[20] = "GUERREIRO"; // declaração e atribuição/inicialização
puts(classe);

Da mesma forma é com sua struct.

struct Player {
    int class_play;
    char class_player[20];
};

struct Player player1;                  // declaração -> OK
player1.class_play = 1;                 // atribuição -> OK
player1.class_player[20] = "GUERREIRO"; // atribuição -> Algo errado não está certo
player1.class_player = "GUERREIRO";     // atribuição -> E isso dá erro de compilação

struct Player player2 = { 2, "MAGO" }; // declaração e atribuição -> OK

puts(player1.class_player);            // imprime nada
puts(player2.class_player);            // imprime corretamente

Consegui pensar em duas possíveis soluções.

A primeira é usar a função strcpy.

struct Player {
    int class_play;
    char class_player[20];
};

int main() {
    struct Player player;

    player.class_play = 1;
    strcpy(player.class_player, "GUERREIRO");

    printf("Cod: %d | Classe: %s", player.class_play, player.class_player);

    return 0;
}

A segunda seria mudar o membro class_player de array de characteres para um ponteiro para character.

struct Player {
    int class_play;
    char* class_player;
};

int main() {
    struct Player player;

    player.class_play = 1;
    player.class_player = "GUERREIRO";

    printf("Cod: %d | Classe: %s", player.class_play, player.class_player);

    return 0;
}

Se vc está definindo as classes apenas direto no código como vc mostrou, a segunda opção vai te servir bem.

Mas se quiser criar um sistema que carrega as informações do personagem a partir de um arquivo externo, a primeira é a indicada.

O único problema é que, pesquisando rapidamente, vi que a função strcpy tem questões com segurança, já que pode causar um buffer overflow, então se for usá-la, apenas pesquise antes pra saber se há alternativas mais segura do que ela.

1 curtida

Valeu vou dar uma pesquisada sobre o strcpy() e dar mas revisadas no código e alterar a estrutura dele fazer algo mas funcional :slight_smile:

1 curtida