2016-10-08 1 views
1

einzugeben, versuche ich eine Zeichenfolge in meinem Code in C++ einzugeben, und wenn ich ausführe, erhalte ich immer den folgenden Fehler: Ausnahme bei 0x0F5023F5 (msvcp140d.dll) in assignment-1.exe: 0xC0000005 ausgelöst : Zugriffsverletzung Schreibort 0x00229C20. Ich werde meinen Code unten veröffentlichen, wenn mir jemand helfen könnte, das großartig wäre. Bitte beachte, dass ich bereits weiß, dass es ein Problem mit mir ist, wenn ich versuche, auf den Speicherort zuzugreifen, auf den du keinen Zugriff hast .Fehler Zugriffsverletzung Schreibort 0x00229C20. Wenn ich versuche, eine Zeichenfolge in der Konsole

HEADER FILE: 
#ifndef item_H 
#define item_h 

class item 
{ 
private: 
    //attributes 
    int itemID; 
    char itemName[20]; 
    float itemcost; 
    float itemprice; 
    //utility function 
    float calcPrice(); 

public: 
    //constructor 
    item(int = 000, char[] = "itemUnknown", float = 0,float = 0); 
    //destructor 
    ~item(); 
    //set functions 
    void setAll(int, char[], float, float); 
    void setID(int); 
    void setName(char[]); 
    void setCost(float); 
    //get function 
    int getID(); 
    float getcost(); 
    float getprice(); 
    void getname(); 
    //print function 
    void print(); 
}; 
#endif 

CPP: 

#include "Dariush.h" 
#include <iostream> 
#include <iomanip> 
#include<string> 
using namespace std; 
//constructor will set attributes 
item::item(int ID, char n[] , float c,float p) 
{ 


     setID(ID); 
     setName(n); 
     setCost(c); 
     setAll(ID, n, c, p); 

} 
//destructor will print destroing two objects 
item::~item() 
{ 
    cout << "destroing two objects : " << " " << itemName << " " 
     << " & " << itemName << endl; 
} 
//set functions : 
void item::setID(int ID) 
{ 
    cout << "please enter the item's ID : " << endl; 
    cin >> ID; 

} 
void item::setName(char n[]) 
{ 
    cout << "please enter the item's name" << endl; 
    cin.ignore(); 
    cin.getline(n, 20); 


} 
void item::setCost(float c) 
{ 
    cout << "please enter the item's cost : " << endl; 
    cin >> c; 
} 
void item::setAll(int ID, char n[], float c, float p) 
{ 
    itemID = (ID > 0 && ID < 999) ? ID : 0; 
    strcpy_s(itemName, n); 
    itemcost = (c > 0) ? c : 0; 
    calcPrice(); 

} 
//get functions : 
int item::getID() 
{ 
    return itemID; 
} 
float item::getcost() 
{ 
    return itemcost; 
} 
float item::getprice() 
{ 
    return itemprice; 
} 
void item::getname() 
{ 
    cout << itemName << endl; 
} 
//print function : 
void item::print() 
{ 
    cout << "ID : " << itemID << endl 
     << "Name : " << itemName << endl 
     << "cost : " << itemcost << endl 
     << "price : " << itemprice << endl; 
} 
// utility function for price callculation : 
float item::calcPrice() 
{ 
    if (itemcost < 1000) 
    { 
     itemprice = itemcost + (itemcost*0.1); 
    } 
    else 
     itemprice = itemcost + (itemcost*0.2); 
    return itemprice; 
} 

MAIN.CPP: 
#include "Dariush.h" 
#include <iostream> 
#include<string> 
using namespace std ; 
void main() 
{ 
    item i1; 
    item i2; 
    i1.print(); 
    i2.print(); 
} 

danke für die Hilfe.

+0

Bitte bearbeiten Sie Ihre Frage, um eine [mcve] zur Verfügung zu stellen. –

Antwort

1

Ermöglicht bei diesen drei Funktionsdeklarationen einen genaueren Blick:

item(int = 000, char[] = "itemUnknown", float = 0,float = 0); 
void setAll(int, char[], float, float); 
void setName(char[]); 

Die Sache hier ist, dass die Zeichen „Array“ Argumente, die Sie erklären sind nicht wirklich alle Arrays. Stattdessen sind sie Zeiger. Wenn Argumente deklariert werden, z.B. char n[] wird tatsächlich vom Compiler als char *n übersetzt.

Die Konstruktordeklaration bewirkt, dass der Zeiger auf das konstante String-Literal "" zeigt. Und das Wichtigste bei konstanten String-Literalen ist, dass sie in der Tat Konstante sind. Der Versuch, ein Zeichenfolgenliteral zu ändern, führt zu undefiniertem Verhalten. Und ändern Sie dieses Literal ist, was Sie versuchen, mit dem cin.getline(n, 20) Aufruf in der setName Funktion zu tun. Nicht nur das, sondern Sie sagen der cin.getline-Funktion auch, mehr zu lesen als in das String-Literal passt.

Die einfache Lösung ist, setName stattdessen in die Elementvariable itemName einzulesen.

+0

ganz gut Kumpel vielen Dank für die Hilfe !! –

0

Es gibt viele Probleme mit diesem Code, sondern derjenige, der die Zugriffsverletzung verursacht ist:

void item::setName(char n[]) 
{ 
    cout << "please enter the item's name" << endl; 
    cin.ignore(); 
    cin.getline(n, 20); //here 
} 

Sie cin.getline(itemName, 20); stattdessen verwenden sollten.

Um solche Fehler in der Zukunft zu vermeiden, deklarieren Argumente wie char const n[] anstelle von char n[] - gute Compiler sollte eine Warnung anzeigen, wenn Sie Zeichenfolge Literale mit nicht-const Zeiger als Argument verwenden.

+0

danke für die Hilfe !! –

Verwandte Themen