C++ 分段故障(堆芯转储)C++;面向对象编程

C++ 分段故障(堆芯转储)C++;面向对象编程,c++,c++11,C++,C++11,我是一名系统工程专业的学生,就读于ULA(洛斯安第斯大学)第二学期 P>我正在为大学编程一个C++迷你项目。该项目包括制作一个面向买卖加密货币的软件草案,然而,从昨天开始,我就遇到了一个问题(一个细分错误)。。。因此,由于这一页对我以前的课程很有帮助,而这次我没有找到任何可以帮助我的东西,所以我决定注册并询问是否有人愿意帮助我 #include <iostream> #include <string.h> #include <stdlib.h> using

我是一名系统工程专业的学生,就读于ULA(洛斯安第斯大学)第二学期

<> P>我正在为大学编程一个C++迷你项目。该项目包括制作一个面向买卖加密货币的软件草案,然而,从昨天开始,我就遇到了一个问题(一个细分错误)。。。因此,由于这一页对我以前的课程很有帮助,而这次我没有找到任何可以帮助我的东西,所以我决定注册并询问是否有人愿意帮助我

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;

class usuario {
    private :
        string username[10], password[10];
        int aux;
    public :
        usuario();
        void setUnamep(string, string, int);
         string getUnamep();
        void setPass(string);
        string getPass();
        int DataAcc(string, string);
        ~usuario();
};

class moneda {  
    protected :
        float cantidad;
    public :
        moneda(float);
        void setCant(float);
        void getCant();
        ~moneda(); 
};

class bitcoin : public moneda {
    private :
        float btc[20];
    public :
        bitcoin (float);
        void setBuy(float, float[]);
        void getBuy();
        void mostrarc(float);
        ~bitcoin();
}; 


usuario::usuario () {
}

void usuario::setUnamep(string username_, string password_, int aux_) {
    string PreUser[20], aux_2;
    aux = aux_;
    for (int i= 1; i <= aux; i++) {  
        username[i] = username_[i];  
        password[i] = password_[i];
        cout<<"\nEnter an username: "; 
        cin>>username[i];               
        cout<<"Enter a password: ";  
        cin>>password[i];       
        username[0] = ".";      //pass 1 leer
            for (int v = 0 ; v < i; v++) {     
                if (username[v] == username[i]) {  
                    cout<<"\nUsername already in use. Choose another"<<endl;
                    username[i] = "null";
                    password[i] = "null";
                    i--;
                    v = 20000;
                }
            }
       }
}


int usuario::DataAcc(string InUs, string InPass) {
    bool ing = false, ret = false;
    int u = 0;
    do  {
        if (InUs==username[u] and InPass==password[u]) {
            ing = true;
            u = 10;
            ret = true;
        }
        else  //////
        u++;
    }
    while (ing == false and u<5);
    if (u == 5)
        cout<<"\nIncorrect user or password. Try again."<<endl;
    if (ing == true) {
        cout<<"\nAccount data..."<<endl;      
    }
    return ret;
}

usuario::~usuario() {
}

moneda::moneda(float cantidad_) {
    cantidad = cantidad_;
}

moneda::~moneda() {
}                                            

bitcoin::bitcoin(float cantidad_) : moneda(cantidad_) {
}

void bitcoin::setBuy(float cantidad_, float btc_[]) {
    int aux;
    for (int i = 0; i < 20 ; i++) {
        btc[i] = btc_[i];
    }
    cout<<"How many BTC do you wish to buy?: ";
    cin>>cantidad;
    btc[aux] = btc[aux] + cantidad;
}

bitcoin::~bitcoin() {   
} 

int main() {
    int opc = 0, aux1;
    string InUs, InPass;
    int aux2 = 0;
    bitcoin b1(0);
    cout<<"Welcome to BitZuela 2018, down there you have several options for you to choice which one do you want to run. ";
    cout<<"\n\n1. Sign Up."<<endl;
    cout<<"2. Log in."<<endl;
    cout<<"3. Finish program."<<endl;   
    usuario u1; 

    while (opc >=0 and opc <=2) {
    cout<<"\nPress the button of the option you want to run: "; 
    cin>>opc;

    if (opc==1) {
        cout<<"\nHow many accounts do you want to register?: ";
        cin>>aux1;
        u1.setUnamep("null", "null", aux1);
    } 
    if (opc==2) {
        cout<<"\nUsername: ";
        cin>>InUs;
        cout<<"Password: ";
        cin>>InPass; 
        aux2 = u1.DataAcc(InUs, InPass);
        if (aux2 == 1) {
            b1.setBuy(0,0);  //The problem is when this object is created
        }
    }
    if (opc == 3)
        cout<<"\nProgram finished."<<endl;
    }       
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
usuario类{
私人:
字符串用户名[10],密码[10];
int aux;
公众:
usuario();
void setUnamep(string,string,int);
字符串getUnamep();
无效setPass(字符串);
字符串getPass();
int DataAcc(字符串,字符串);
~usuario();
};
moneda类{
受保护的:
浮雕;
公众:
莫奈达(浮动);
无效设置(浮动);
void getCant();
~moneda();
};
比特币类别:公共货币{
私人:
浮动btc[20];
公众:
比特币(浮动);
void setBuy(浮动,浮动[]);
void getBuy();
void mostrarc(浮动);
~bitcoin();
}; 
乌萨里奥::乌萨里奥(){
}
void usuario::setUnamep(字符串用户名、字符串密码、int aux){
字符串预用户[20],辅助用户2;
aux=aux_u2;;

对于(inti=1;i而言,这种方法似乎存在一些问题

void bitcoin::setBuy(float cantidad_, float btc_[]) {
    int aux;
    for (int i = 0; i < 20 ; i++) {
        btc[i] = btc_[i];
    }
    cout<<"How many BTC do you wish to buy?: ";
    cin>>cantidad;
    btc[aux] = btc[aux] + cantidad;
}

可能还有其他一些问题,但解决这些问题将是朝着正确方向迈出的一步。您的核心转储在setBuy函数中。您要求一个浮点数组,但在代码中调用它时,会传递一个“0”,但应该传递一个20个元素的数组

aux变量设置在函数内部,但我认为应该从函数的签名传递它

此外,您在该函数中使用的cantidad变量不是签名中的变量(您应该将其从签名中删除,或者在cantidad中添加一个uu)


我还研究了setUnamep函数,您应该使用std::map来管理用户名和密码(您可以在日志(n)中搜索已经存在的密钥)。

我建议您学习如何在核心文件中使用调试器来查找错误。如果您有gdb,您可以按如下方式执行:“gdb MyProg core。”。这将准确地告诉您程序的行号。是的,aux未初始化变量是一个问题。另一个问题是您正在访问超出setUnamep中字符串长度的用户名和密码字符串。
if (aux2 == 1) {
    b1.setBuy(0,0);