すぐにわかる 4 つの問題:
問題1
struct
には、次のものがあります。
char * make[200];
英語では、これは「文字への 200 個のポインターの配列を作成する」と言っています。したがって、代わりに次のものが必要です。
char make[200]
.
問題 2
からループしてい1
ます。これにより、配列の最初の車がスキップされます。配列のインデックスは 0 であることに注意してください。したがって、代わりに次のものが必要です。
for (int i = 0 ; i < num ; i++)
表示目的で、次のように言うことができます。
cout << "Car #" << (i+1) << ":" << endl << "Please enter the make: ";
問題 3
あなたが言うところ:
cin.getline(*Cars->make,200);
と
cin >> Cars->manfYear;
これらの行のどこで、ユーザーがどの車に乗り込んでいるかを指定していますか? どこにもない。でループしている場合はi
、実際に言及する必要がありますi
。これらは動作するはずです:
cin.getline(Cars[i].make,200);
と
cin >> Cars[i].manfYear;
.
ではなくを使用していることに注意してください->
。これは、Cars
配列内の項目がポインタではなく実際のインスタンスであるためです。Cars
配列自体はポインターですが、その内容ではありません。
問題4
これを最初に指摘した@Ben Cの功績:>>
演算子とgetline()
function onを混在させると、残りのが呼び出しに入るというcin
奇妙な動作につながる可能性があります。all (欠点: make を読み取るときに制限が適用されない) または all (欠点: 文字列バッファーを使用してから、車の数と年に変換する必要がある) のいずれかを使用するか、各呼び出しの後に置くことができます。の、次のように:CR
>>
getline()
>>
200
cin.getline()
cin.ignore()
>>
cin >> num;
cin.ignore();
と
cin >> Cars[i].manfYear;
cin.ignore();
繰り返しますが、これに最初に気付いた@Ben Cの功績です。
最後だが大事なことは
慣例により、クラス/構造体には大文字の名前が付けられ、変数には小文字/キャメルケースの名前が付けられます。from の名前を に変更し、配列の名前をstruct
fromcar
に変更することを検討してください。つまり、現在の大文字と小文字の逆です。Car
Cars
cars
最後に、ここで他のすべてのポスターに同意します。配列string
の代わりに使用することを検討する必要があります。char