您有最終用戶輸入的特殊符號,所以您可以要求輸入,直到您獲得此符號(「。」)。代碼可以是這樣的:
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)並從中讀取用戶信息。
你可以殺死服務的一部分的數量,使用'getline'每個輸入行,提取名稱,並使用容器的兩個迭代器構造函數來初始化它們所需的服務。然後可以用size()來訪問這個數字。 – chris