Struct member print print something strange

Asked

Viewed 63 times

-1

I’m doing a job that uses struct it’s all right but when it comes to listing the last one comes out with a strange character.

mostrando erro

My code is like this

struct livro_cadastro{
    int codigo;
    char obra[30]; 
    char autor[30]; 
    char editora[30];
};

int main(){
    int p, codigo2, i;
    struct livro_cadastro livro[5];
    p = 1;
    codigo2 = 1;

        while ( p != 0 ){
            printf("\nMENU. \n\n"
            "1 - Inserir um novo cadastro.\n"
            "2 - Mostrar todos os cadastros.\n"
            "0 - Encerrar.\n");
        printf("\nEscolha sua opcao:");
        scanf("%d", &p );
        fflush(stdin);
        switch (p){

    case 1:
        if (codigo2 <= 5){

            printf("\nNovo cadastro.\n");
            printf("Codigo:%d \n", codigo2);
            printf("Insira o nome do livro: \n");
            fgets(livro[codigo2].obra, 30, stdin);
            fflush(stdin);
            printf("Insira o nome do autor: \n");
            fgets(livro[codigo2].autor, 30, stdin);
            fflush(stdin);
            printf("Insira o nome da editora: \n");
            fgets(livro[codigo2].editora, 30, stdin);
            fflush(stdin);
            codigo2++;
        }
        else{
            printf("\nSistema de cadastro lotado.\n");
        }
    break;

    case 2:
        if(codigo2 == 1){
            printf("\nA lista esta vazia!\n");

        }
        else{
            printf("\nCadastros.\n");
            for(i = 1 ; i < codigo2 ; i++)
            {
                printf("\nCodigo:%d ", i);
                printf("\n\nNome do livro: %s\n",livro[i].obra);
                printf("Nome do autor: %s\n",livro[i].autor);
                printf("Nome da editora: %s\n",livro[i].editora);
            }

        }
    break;

    case 0:
        printf("Encerrando o programa.\n");


    default:
        printf("Opcao invalida!");
    break;
//  case 2:
//      desempilhando();
//  break;
//
//  case 3:
//      esvaziar_pilha();
//  break;
    }
}
return (0);

}
  • Did the answer solve your question? Do you think you can accept it? See [tour] if you don’t know how you do it. This would help a lot to indicate that the solution was useful for you. You can also vote on any question or answer you find useful on the entire site (when you have 15 points).

1 answer

1

The whole problem happens because the code has something conceptual wrong, so I tidied up the whole code, with organized code is always easier to work. It started with the code worth 1, and it should be a counter of how many items there are registered, so it should start with 0. When it starts with 1 you already start to register in the second slot of array, giving the error presented. So it is right:

#include <stdio.h>

typedef struct {
    int codigo;
    char obra[30]; 
    char autor[30]; 
    char editora[30];
} Livro;

int main() {
    int codigo = 0;
    Livro livro[5];
    int op = 1;
    while (op != 0) {
        printf("\nMENU.\n"
        "1 - Inserir um novo cadastro.\n"
        "2 - Mostrar todos os cadastros.\n"
        "0 - Encerrar.\n");
        printf("\nEscolha sua opcao:");
        scanf("%d", &op);
        int c; //para limpar buffer
        while ((c = getchar()) != '\n' && c != EOF) { }
        switch (op) {
        case 1:
            if (codigo < 5) {
                printf("\nNovo cadastro.\n");
                printf("Codigo:%d \n", codigo);
                printf("Insira o nome do livro: \n");
                fgets(livro[codigo].obra, 30, stdin);
                printf("Insira o nome do autor: \n");
                fgets(livro[codigo].autor, 30, stdin);
                printf("Insira o nome da editora: \n");
                fgets(livro[codigo].editora, 30, stdin);
                codigo++;
            } else printf("\nSistema de cadastro lotado.\n");
        break;
        case 2:
            if (codigo == 0) printf("\nA lista esta vazia!\n");
            else {
                printf("\nCadastros.\n");
                for (int i = 0 ; i < codigo; i++) {
                    printf("\nCodigo:%d ", i);
                    printf("\nNome do livro: %s", livro[i].obra);
                    printf("Nome do autor: %s", livro[i].autor);
                    printf("Nome da editora: %s", livro[i].editora);
                }
            }
        break;
        case 0:
            printf("Encerrando o programa.\n");
            break;
        default:
            printf("Opcao invalida!");
        break;
        }
    }
}

Behold working in the ideone. And in the repl it.. Also put on the Github for future reference.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.