2016-10-07 19 views
-4

私はC++を初め、まだそれを学んでいます。私は本の練習をしましたが、私のプログラムではすべてが正しいようですが、入力した入力を表示するとクラッシュします。異なるコンパイラとコンピュータ、結果は同じでした。誰かがあなたに感謝することを願っています。そしてここにプログラムがあります。C++の入力文字列のクラッシュ

+0

変更'コード[1] 'を持つ唯一のcharであることを定義しますか? –

+0

私は 'char [1]'を1つの 'char'で変更します。そうでなければ' std :: cin'は '[1]'に '\ 0'を挿入しますUBを作ります –

+3

この問題を解決する正しいツールはあなたのデバッガ。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

答えて

1

char code[1];配列はポインタのように扱われ(彼ら "崩壊")関数に渡さ:

#include<iostream>      
using namespace std; 

int main()     
{ 

    string name; 
    char code[1]; 
    float price; 
    int quantity; 

    cout<<"Enter an item name : "<<endl; 
    getline(cin,name); 

    cout<<"Enter the item code : "<<endl; 
    cin>>code; 

    cout<<"Enter the price per unit : "<<endl; 
    cin>>price; 

    cout<<"Enter the quanlity : "<<endl; 
    cin>>quantity; 

    cout<<"You entered the item name : "<<name<<endl 
     <<"You entered the item code : "<<code<<endl 
     <<"You entered the item price : "<<"RM"<<price<<endl 
     <<"You entered the item quantity: "<<quantity<<" unit"<<endl 
     <<"The total cost : "<<"RM"<<(quantity*price)<<endl;  
    return 0; 
} 

は、これが出力されます。ここで減衰する配列の詳細:What is array decaying?

cin>>code;>>はそうcodecharへのポインタとして見られている、実際には関数です。 charへのポインタは、Cスタイルの文字列であるかのように扱われ、NULL終了を試みます。悲しいことに、1文字分の空き領域と空のターミネータの空き領域がないため、空のターミネータはプログラムが所有していないメモリに書き込まれます。

プログラムがそれでも生き残れば、"You entered the item code : "<<code<<endl<<は、charへのポインタもCスタイルの文字列であるかのように扱い、ヌルターミネータを見つけて、配列の最後を過ぎて、無効なメモリから読み込み、最後にヌル文字を見つける場所を知っている人と、やめる。

ソリューション:

一つだけcharをしたい場合は、コードは `code`へ

char code;