私はC++を初め、まだそれを学んでいます。私は本の練習をしましたが、私のプログラムではすべてが正しいようですが、入力した入力を表示するとクラッシュします。異なるコンパイラとコンピュータ、結果は同じでした。誰かがあなたに感謝することを願っています。そしてここにプログラムがあります。C++の入力文字列のクラッシュ
-4
A
答えて
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;
>>
はそうcode
がchar
へのポインタとして見られている、実際には関数です。 char
へのポインタは、Cスタイルの文字列であるかのように扱われ、NULL終了を試みます。悲しいことに、1文字分の空き領域と空のターミネータの空き領域がないため、空のターミネータはプログラムが所有していないメモリに書き込まれます。
プログラムがそれでも生き残れば、"You entered the item code : "<<code<<endl
。 <<
は、char
へのポインタもCスタイルの文字列であるかのように扱い、ヌルターミネータを見つけて、配列の最後を過ぎて、無効なメモリから読み込み、最後にヌル文字を見つける場所を知っている人と、やめる。
ソリューション:
一つだけchar
をしたい場合は、コードは `code`へ
char code;
関連する問題
- 1. C#入力文字列エラー
- 2. C++入力文字列のスペース
- 3. (Arraylist)ユーザ定義の文字列入力時にクラッシュする
- 4. 入力文字列
- 5. 入力文字列
- 6. のpython:文字列入力
- 7. 文字列のユーザー入力
- 8. スレッドクラスの入力文字列
- 9. 文字列入力後にプログラムがクラッシュする
- 10. ファイルからの入力文字列と入力文字列の比較
- 11. CおよびC++での文字列入力
- 12. ポインタの配列の入力文字列
- 13. 時刻入力Java入力文字列
- 14. 文字列配列無限ループへのC++ユーザー入力
- 15. 連続した文字列入力用のC++動的配列
- 16. Cのコマンドラインからの文字列または文字の入力
- 17. C++のみの文字と空白の入力の入力
- 18. Cのユーザからの文字列の入力セット
- 19. 入力文字列エラーEOF
- 20. java.lang.NumberFormatException:入力文字列: "20,475.00"
- 21. は、入力文字列
- 22. 入力文字列:エラー
- 23. java.lang.NumberFormatException:入力文字列: ""
- 24. java.lang.NumberFormatException:入力文字列: "0.89829948"
- 25. 入力文字列scanf
- 26. NumberFormatException:入力文字列: "5,2"
- 27. C#正規表現の入力文字列の問題
- 28. Cでの文字列入力の処理
- 29. C++でのユーザー入力との文字列連結
- 30. C言語のクラス変数への文字列入力
変更'コード[1] 'を持つ唯一の
char
であることを定義しますか? –私は 'char [1]'を1つの 'char'で変更します。そうでなければ' std :: cin'は '[1]'に '\ 0'を挿入しますUBを作ります –
この問題を解決する正しいツールはあなたのデバッガ。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –