ユーザーの入力を終了するための特別な記号があるため、この記号 (".") を取得するまで入力を求めることができます。コードは次のようになります。
while(true)
{
std::string name;
std::cin >> name;
if(name == ".")
break;
// number of services
size_t n = 0;
std::cin >> n;
// list of services
std::vector<std::string> services(n);
for(size_t i = 0; i < n; ++i)
std::cin >> services[i];
// Here you can process user
// You know user's name and have std::vector of his services
}
このコードは、ユーザー名が "." になるまで無限にループします。
すべてのユーザーを出力するか、リストで処理する場合は、それらをベクトルに保存する必要があります。
struct User
{
User(const std::string& _name):
name(_name)
{
}
std::string name;
std::vector<std::string> services;
};
std::vector<User> users;
int main( )
{
std::vector<User> users;
while(true)
{
std::string name;
std::cin >> name;
if(name == ".")
break;
users.push_back(User(name));
size_t n = 0;
std::cin >> n;
for(size_t i = 0; i < n; ++i)
{
std::string serviceName;
std::cin >> serviceName;
users.back().services.push_back(serviceName);
}
}
for(size_t n = users.size(), i = 0; i < n; ++i)
{
std::cout << users[i].name;
std::cout << " ";
std::cout << users[i].services.size();
std::cout << " ";
for(size_t s = users[i].services.size(), j = 0; j < s; ++j)
std::cout << users[i].services[j] << " ";
std::cout << std::endl;
}
return 0;
}
このコードは、ユーザーとそのサービスを読み取り、それらを出力します。
各ユーザーが別の回線にいることがわかっている場合は、各ユーザーを読み取る別の方法があります。
std::string l;
std::getline(std::cin, l);
std::istringstream ss(l);
std::string name;
ss >> name;
if(name == ".")
break;
users.push_back(User(name));
size_t n = 0;
ss >> n;
for(size_t i = 0; i < n; ++i)
{
std::string serviceName;
ss >> serviceName;
users.back().services.push_back(serviceName);
}
入力ストリーム (cin) から行全体を読み取ってから、stringstream (ss) を作成し、そこからユーザー情報を読み取ります。