Roger Pont 70778745 M 20120345 hills@school.edu
Tommy Holness 5127438973 M 20120212 tommy@school.edu
Lee Kin Fong 864564456434 F 30245678 fong@school.edu
上記のデータを見て、各行を逆方向に処理すると、問題は非常に簡単になります。
- 単語を 1 行に分割します。単語数を とします
N
。
- 最後の単語は email、つまり
words[N-1]
=> メールアドレス
- 最後から 2 番目はStudentid、つまり
words[N-2]
=> 学生 ID です。
- 同様に、最後から 3 番目は性別、最後から 4 番目は電話、残りの単語は名前になります。
それはあなたに十分なヒントを与えました。
コード:
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <iterator>
#include <cassert>
struct student
{
std::string name;
std::string phone;
std::string gender;
std::string student_id;
std::string email;
};
int main()
{
std::vector<student> students;
std::string line;
while(std::getline(std::cin, line))
{
std::istringstream ss(line);
std::istream_iterator<std::string> begin(ss), end;
std::vector<std::string> words(begin, end);
assert(words.size() >= 5);
int n = words.size() - 1;
student s { words[0], words[n-3], words[n-2], words[n-1], words[n] };
for (int i = 1 ; i < n - 3 ; i++) s.name += " " + words[i];
students.push_back(s);
}
//printing
for(auto && s : students)
std::cout << "name = " << s.name << "\n"
<< "phone = " << s.phone << "\n"
<< "gender = " << s.gender << "\n"
<< "student_id = " << s.student_id << "\n"
<< "email = " << s.email << "\n\n";
}
入力:
Roger Pont 70778745 M 20120345 hills@school.edu
Tommy Holness 5127438973 M 20120212 tommy@school.edu
Lee Kin Fong 864564456434 F 30245678 fong@school.edu
出力:
name = Roger Pont
phone = 70778745
gender = M
student_id = 20120345
email = hills@school.edu
name = Tommy Holness
phone = 5127438973
gender = M
student_id = 20120212
email = tommy@school.edu
name = Lee Kin Fong
phone = 864564456434
gender = F
student_id = 30245678
email = fong@school.edu
オンラインデモ
ここで、コードを理解するために少し時間を費やしてください。お見せしたコードは C++11 を使って書かれています。これは、Modern C++ の多くのイディオムを示しています。
- ファイルの読み方. 1行ずつ。
- 行を分割し、文字列のベクトルを設定する方法。
- 構造体を埋める方法(問題固有)
それが役立つことを願っています。