前提・実現したいこと
ど素人の初歩的な質問ですみません。いくら調べても、よくわからなかったので質問させていただきます。
ユーザーの数、名前、年齢を聞いて、名前の文字数を表示するプログラムを作りたいのですが、思ったように表示されません。
正直言って、まだポインタを完璧に理解できていないので、どう直せばいいのかわかりません…
理想の結果は:
The name Tanaka has length 6
The name Satou has length 5
発生している問題・エラーメッセージ
とくにエラーメッセージなどは、表示されませんが、データの保存がうまくいきません。 一人目の名前はちゃんと記録されるのですが、二人目以降が全部最初の人の名前になってしまいます。
該当のソースコード
C++
1#include <iostream> 2#include <string> 3using namespace std; 4 5// Person class 6class Person 7{ 8private: 9 string name; 10 int age; 11public: 12 Person() { 13 name = ""; 14 age = 0; 15 } 16 17 Person(string name1, int age1) 18 { 19 name = name1; 20 age = age1; 21 } 22 23 string setName(string name1) { 24 name = name1; 25 return name; 26 } 27 28 int setAge(int age1) { 29 age = age1; 30 return age; 31 } 32 33 int getAge() { return age; } 34 string getName() { return name; } 35}; 36 37 38// Prototypes 39int lengthOfName(Person* p); 40 41int main() 42{ 43 const int LENGTH = 30; 44 int i, ages; 45 char* names = nullptr; 46 names = new char[LENGTH]; 47 48 Person* pPerson = nullptr; 49 50 cout << "Please enter number of persons: "; 51 cin >> i; 52 53 pPerson = new Person[i]; 54 55 56 for (int index = 0; index < i; index++) { 57 58 cout << "Please enter your name: "; 59 cin.get(); 60 cin.getline(names, LENGTH); 61 62 63 cout << "Please enter your age: "; 64 cin >> ages; 65 66 pPerson[index].setName(names); 67 pPerson[index].setAge(ages); 68 69 70 } 71 72 for (int index = 0; index < i; index++) { 73 cout << "The name " << pPerson->getName() 74 << " has length " << lengthOfName(pPerson) << endl; 75 76 77 } 78 79 delete[]pPerson; 80 81 return 0; 82} 83 84//ここはいじらなくて大丈夫です 85int lengthOfName(Person* p) 86{ 87 string name = p->getName(); 88 return name.length(); 89} 90 91/*実行結果 92The name ??? has length 3 93The name ??? has length 3 94The name ??? has length 3 95*/ 96
試したこと
いろんなサイトを調べて、なんとかここまでこぎつけましたが、これ以上はどう直せばいいのかよくわかりません。
追記
いわれた通り、インデックスを加えたらちゃんと名前が表示されるようになりましたが、もう一つの目的である文字数の表示がうまくいきません。
C++
1for (int index = 0; index < i; index++) { 2 cout << "The name " << pPerson[index].getName() 3 << " has length " << lengthOfName(pPerson) << endl;
現在の実行結果は
The name Tanaka has length 6
The name Satou has length 6
The name Ito has length 6
といった感じです。
これをどうにかして上記の理想の実行結果にしたいです。
C++
1lengthOfName(pPerson)
おそらくこの部分がうまく参照できず、一番最初の名前を引っ張ってきているみたいです。
どうすれば解決するのでしょうか??
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/28 02:54
2019/07/28 03:08
2019/07/28 03:54
2019/07/28 04:41
2019/07/28 05:23
2019/07/28 10:07