2017-04-09 6 views
0

私はアートギャラリー管理プログラム(種類)を作成しようとしており、構造体に値を挿入するとプログラムがクラッシュします。誰でもerros/bad codingを見つけることができますか?ここで 構造体の使用に問題があり、変数に関数を使用して(関数を使用して)埋め込みます。

は私のコードです(すみません変数名はポルトガル語である): 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); 
} 
+0

なぜ 'std :: string'の代わりに' char'配列、 'std :: cout'や' std :: cin'の代わりに 'printf'と' scanf'を使用していますか?あなたの誤った 'scanf'の使用が最初の問題として飛び出します。 – aschepler

+0

std :: cinを使ってポインタを使って入力を送るにはどうすればいいですか? –

答えて

0

のように彼のコメントに記載されているascheplerは、charをに変更します

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

とあなたのinserir.h中:そうのように0秒とstd::cin sまでのすべてのscanf秒、

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"を見ました。それは本当に悪い習慣です。

関連する問題