having trouble using structs and filling their variables with functions (usingpointers)

时间:2017-04-09 23:36:03

标签: c++ function pointers struct

Okay so I'm trying to do an art gallery management program (kind of), and when inserting the values into the struct the programm crashes. anyone can spot erros/bad coding?

Here is my code (sorry the variable names are in portuguese): main.cpp

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <string>
#include "liga.h"

using namespace std;

bool menu1=false,
     menu2=false,
     menu3=false;

int opc,opc1;
string key="1qaz2wsx",pass;

int main()
{
    OBRAS database;
    OBRAS *ptr;

    ptr=&database;

    do {
        printf("\n\t********************     GESTOR ADAO     ********************\n");
        printf("\t\t   ->            modo admin          - prima 1\n");
        printf("\t\t   ->            modo guest          - prima 2\n");
        printf("\t\t   ->               exit             - prima 3\n");
        cin>>opc;

        if (opc<1 || opc>3)  printf("\nInseriu uma opcao invalida, tente de novo.\n\n");

        if (opc==1) {
            do {
                cin.sync();
                cin.clear();
                system("cls");
                printf("Insira a password:\n");
                cin>>pass;

                if (pass!=key) printf("\nPassword incorreta, tente de novo;\n");

            } while (key!=pass);

            do {
                cin.sync();
                cin.clear();
                system("CLS");
                printf("\n\t********************     GESTOR ADAO     ********************\n");
                printf("\t\t   ->            inserir obra          - prima 1\n");
                printf("\t\t   ->            listar obras          - prima 2\n");
                printf("\t\t   ->                voltar            - prima 3\n");
                cin>>opc1;

                if (opc1<1 || opc1>3)  printf("\nInseriu uma opcao invalida, tente de novo.\n\n");

                if (opc1==3)  menu2=true;

                if (opc==1) {
                    cin.sync();
                    cin.clear();
                    inserir(ptr);
                }
            } while(menu2==false);

        }

        /*else if (opc==2) ->MODO GUEST, sem pass, read only*/

        if (opc==3)  menu1=true;
    } while (menu1==false);

return EXIT_SUCCESS;
}

liga.h

#ifndef LIGA
#define LIGA

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <string>

typedef struct obras {
    char autor[50];
    char nome[50];
    int ano;
    int price;
}OBRAS;

#include "inserir.h"

//#include "main.cpp"
//AQUI SÃO CHAMADOS OS OUTROS HEADERS
/*#include "inserir.h"
#include "lista.h"*/

#endif

inserir.h

void inserir(OBRAS *ptr) {
    std::cin.sync();
    std::cin.clear();
    system("CLS");
    printf("Insira o nome do autor da obra:\n");
    scanf("%[50]", ptr->autor);

    std::cin.sync();
    std::cin.clear();
    printf("Insira o nome da obra:\n");
    scanf("%[50]",ptr->nome);

    std::cin.sync();
    std::cin.clear();
    printf("Insira o ano em que foi feita a obra:\n");
    scanf("%d",ptr->ano);

    std::cin.sync();
    std::cin.clear();
    printf("Insira o preco da obra:\n");
    scanf("%d",ptr->price);
}

1 个答案:

答案 0 :(得分:0)

与评论中提到的aschepler一样,将所有char更改为std::string s,将所有scanf更改为std::cin s,如下所示:

typedef struct obras {
    std::string autor;
    std::string nome;
    int ano;
    int price;
}OBRAS;

并在你的inserir.h中:

void inserir(OBRAS *ptr) {
    std::cin.sync();
    std::cin.clear();
    system("CLS");
    std::cout << "Insira o nome do autor da obra:\n";
    std::cin >> ptr->autor;

    std::cin.sync();
    std::cin.clear();
    std::cout << "Insira o nome da obra:\n";
    std::cin >> ptr->nome;

    std::cin.sync();
    std::cin.clear();
    std::cout << "Insira o ano em que foi feita a obra:\n";
    std::cin >> ptr->ano;

    std::cin.sync();
    std::cin.clear();
    std::cout << "Insira o preco da obra:\n";
    std::cin >> ptr->price;
}

在编辑你的帖子时,我(幸运的是)看到一条注释行#include "main.cpp"。不要这样做,这是非常糟糕的做法。