2016-10-08 4 views
1

の文字列を入力しようとしています。私のコードにC++で文字列を入力しようとしていますが、いつ実行するといつも次のエラーが出ます:0x0F5023F5(msvcp140d.dll)のassignment-1.exeでスローされた例外:0xC0000005 :アクセス違反の書き込み場所0x00229C20。もし誰かが私を助けることができれば私のコードは以下のように投稿してくれるでしょう。あなたがアクセス権を持っていないメモリの場所にアクセスしようとしている私の問題を既に知っていることに注意してください。 。エラーアクセス違反の書き込み場所0x00229C20。

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

ありがとうございます。

+0

あなたの質問を[編集]して[mcve]を提供してください。 –

答えて

1

これら三つの関数の宣言を詳しく見てみましょう:ここ

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

事はあなたが宣言した文字「アレイ」の引数が本当にでは、すべてのアレイではないということです。代わりに、ポインタです。引数を宣言するとき、例えば。 char n[]は、実際にはchar *nとしてコンパイラによって変換されます。

コンストラクタ宣言は、ポインタが定数文字列リテラル""を指し示すようにします。定数文字列リテラルに関する重要なことは、実際には定数であることです。文字列リテラルを変更しようとすると、の定義されていない動作になります。そして、このリテラルを変更するには、setName関数でcin.getline(n, 20)コールを使って何をしようとしていますか。それだけでなく、cin.getline関数に、文字列リテラルの適合度以上の値を読み取らせるように指示しています。

単純な解決策は、代入変数itemNameに代わりにsetNameを読み込むことです。

+0

申し訳ありません。 –

0

は、このコードには多くの問題がありますが、アクセス違反を引き起こしているものである:

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

あなたが代わりにcin.getline(itemName, 20);を使用する必要があります。

の代わりにのように引数を宣言してください。非constポインタを引数として文字列リテラルを使用すると、良いコンパイラで警告が表示されるはずです。

+0

助けてくれてありがとう! –

関連する問題