在使用结构体和用函数填充其变量(使用指针)时遇到问题



好的,所以我正在尝试做一个艺术画廊管理程序(有点(,当将值插入结构时,程序崩溃。 任何人都可以发现错误/糟糕的编码吗?

这是我的代码(对不起,变量名称是葡萄牙语(:主.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("nt********************     GESTOR ADAO     ********************n");
        printf("tt   ->            modo admin          - prima 1n");
        printf("tt   ->            modo guest          - prima 2n");
        printf("tt   ->               exit             - prima 3n");
        cin>>opc;
        if (opc<1 || opc>3)  printf("nInseriu uma opcao invalida, tente de novo.nn");
        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("nt********************     GESTOR ADAO     ********************n");
                printf("tt   ->            inserir obra          - prima 1n");
                printf("tt   ->            listar obras          - prima 2n");
                printf("tt   ->                voltar            - prima 3n");
                cin>>opc1;
                if (opc1<1 || opc1>3)  printf("nInseriu uma opcao invalida, tente de novo.nn");
                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;
}

西甲

#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

因塞里尔·

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);
}

就像 aschepler 在他的评论中提到的那样,将所有 char s 更改为 std::string s,将所有 scanf s 更改为 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".不要那样做,这真的很糟糕。

最新更新