2016-03-21 10 views
0

私は自分自身でStephen Prataの "C++ Primer Plus 6th Edition"を使ってC++を学習しようとしています。第5章の演習の1つでは、 私の質問は次のとおりです:構造体のC++動的配列ユーザー入力

1)構造体にcharの配列の代わりに文字列オブジェクトを使用できますか?もしそうなら、どうすれば教えてくれますか?

2)複数の単語からなる名前をユーザーが入力できるようにするにはどうすればよいですか?get()、getline()などを使用しようとしていますが、

3)単純なプログラムだとわかっていますが、どのようにコードを改善できますか?

ありがとうございます。

struct automobile 
{ 
    std::string name; 
    int year; 
}; 

2) How can I enable the user to input a name that consists of more than one word? I've been trying to use get(), getline() etc. but I just can't make it work.

使用std::getline()

cout << "Please enter the make: "; 
std::getline(std::cin,car[n].name); cout << endl; 

3) I know it is a simple programme but in what way could the code be improved?

#include<iostream> 
using namespace std; 

const int ArSize = 20; 

struct automobile 
{ 
    char name[ArSize]; 
    int year; 
}; 

int main() 
{ 
cout << "How many cars do you wish to catalogue?\n"; 
int number; 
cin >> number; 

automobile * car = new automobile[number]; 
int n = 0; 

while (n < number) 
{ 
    cout << "Car #" << n+1 << ":\n"; 
    cout << "Please enter the make: "; 
    cin >> car[n].name; cout << endl; 

    cout << "Please enter the year: "; 
    cin >> car[n].year; cout << endl; 
    n++; 
} 

    cout << "Here is your collection:\n"; 

int m = 0; 
while (m < number) 
{ 
    cout << car[m].year << " " << car[m].name << endl; 
    m++; 
} 
delete [] car; 
return 0; 
} 
+0

1.おそらくそれを使うことができますが、おそらくSTD/STL全体のもう1つのレッスンになるでしょう。 2.なぜ1つ以上の単語を入力する必要がありますか?そして、なぜ現在のコードはそれを行うことができませんか? 3.それが簡単な場合 - それを改善しないでください。あなたはそれを間違ってしまいます。 – Igor

+0

質問3については、この場合、Whileループは本当に適切ではありません。代わりにforループを使用してください。 Forループは伝統的に繰り返しごとに変数をインクリメントするために使用されます。ブール値フラグや、ループごとにインクリメントされなかった条件文を使用していた方が時間がかかります。また、読みやすくするために、カプセル化されたコード行をインデントするようにしてください。 int main(){...}内のすべてがインデントされているはずです。ほとんどの場合、新しいプログラマーとして、endlと "\ n"の違いを知ることをお勧めしますが、それらを交換可能に使用しているようですが、全く同じものはありません – shockawave123

+0

最後の一言! "number"のような一般的な変数名から離れてください。これは乗り込むのが嫌な習慣です。車の数には「numCars」のような名前を付けてください。また、あなたの "car"変数も少し一般的ですが、この小さな例ではおそらく動作します。しかし、それはリストなので、それは複数の車に変更することをお勧めします。それは車のリストであり、単なる車ではありません。これは自己文書化コードと呼ばれます。に入るための良い習慣。 – shockawave123

答えて

1

1) Can I use a string object instead of an array of char in the structure? If so, could you tell me how?

はい、単にタイプstd::stringのメンバ変数を提供そのような質問は、作業コードをすぐにSE Code Reviewにお願いします。スタックオーバーフローの場合、これはしばしばが広すぎるとレンダリングします。

+0

ありがとうございました。 私は 'std :: getline(std :: cin、car [n] .name);を試してみました。 cout << endl; ' しかし、私は次のエラーが表示されます: エラー: 'getline(std :: istream&、char [20])'の呼び出しでエラーが発生しました。 –

+0

@KonradBjörnthorneそういうわけで、 'std :: string name;' 'char name [ArSize];ではなく、' 'std :: string name; –