分段故障(核心转储)C++面向对象编程

5hcedyr0  于 2023-04-08  发布在  其他
关注(0)|答案(2)|浏览(141)

所以,我正在为大学编程一个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;
}

就这样,如果有人能帮我解决这个问题,我将非常感激。另外,如果你对另一件事有什么建议,我会很高兴阅读的!

db2dz4w8

db2dz4w81#

这种方法似乎有些麻烦

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

“aux”变量在设置之前使用,导致未定义的行为。
此外,调用传递的是0而不是float[]。编译器将0解释为nullptr,导致::setBuy中的崩溃

if (aux2 == 1) {
    b1.setBuy(0,0);

可能还有其他一些问题,但解决这些问题将是朝着正确方向迈出的一步

rqmkfv5c

rqmkfv5c2#

你的核心转储是在setBuy函数中。你要求一个float数组,但是当你在代码中调用它时,你传递了一个“0”,但是你应该传递一个20个元素的数组。
aux变量在函数内部设置,但我认为应该从函数的签名传递它。
此外,您在该函数中使用的cantidad变量不是签名中的变量(您应该将其从签名中删除,或向cantidad添加_)。
我还研究了你的setUnamep函数,你应该使用std::map来管理你的用户名和密码(你可以在log(n)中搜索已经存在的密钥)。

相关问题