cin是否有未知数量的物体?

时间:2012-10-16 02:13:47

标签: c++ queue cin

对于一个项目,我必须建立一个队列来查询人员名称,他们想要的服务数量以及他们想要的每项服务的列表。可以多次询问相同的服务。

基本上它的输入看起来像这样。

Dave 3 spa sauna pedicure
sarah 4 spa spa walk sauna
jim 1 walk
.

“。”表示我所有输入的结束。无论何时行走,一旦他们走路,他们就不再想做任何事情而离开。所以在莎拉的情况下,她去了水疗中心2次,然后走路和离开。她没有去桑拿房。

我的问题是我不知道我将如何实际查询信息。我假设我有一个表示人的课程,但我不知道如何制作它以便他们可以放置一个随机数量的人。如果它只是3个人,我会使用for循环并将每个保存到数组中的不同位置。

有什么方法可以简单地做到这一点吗?

3 个答案:

答案 0 :(得分:1)

您有最终用户输入的特殊符号,因此您可以在获得此符号之前请求输入("。")。代码可以是这样的:

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
}

此代码无限循环,直到用户的名字等于&#34;。&#34;。

如果要输出所有用户或在列表中处理它们,则必须将它们存储在矢量中。

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)并从中读取用户信息。

答案 1 :(得分:0)

读入名称,一旦他们输入他们将循环执行该号码的操作数量。创建一个常量char来表示每个可能的位置(根据我的理解,他们可以访问指定的位置)。如果下一次读取是walk,则结束循环。这是你的代码的一个非常粗略的轮廓(根据我的理解),这是急于检查我的任何错误

    Declare consts ex:
        const string SPA = "spa";
        const string PEDICURE = "pedicure";
        //etc..etc..

    Decalre vars ex:
        int actions; //amount of actions
        //etc...e

tc..
WHILE name is not the dot

    prompt user for name
    read in name

    prompt user for amount of actions
    read in actions

    DO THIS
        prompt user for action
        read in action into string

        convert to lowercase(optional)
        compare action to possible places
            increment chosen place
        increment counter var(s)
    WHILE input is not walk and actions does not exceed max actions


display output

答案 2 :(得分:0)

对于getline来说很简单:

string line;
while(getline(cin,line))
{
    if (line.empty())
       break;
    file.push_back(line);
}

但是对于cin objects我找到了一种在结尾处中断的方法,不需要任何破折号。您必须使用相同的变量来cin所有对象。使用后,需要将其设置为默认退出值。然后检查下一个cin之后的变量是否相同。示例:

string o;
while(true){
    cin>>o;
    if (o.compare("tmp")==0)
        break;
    // your normal code
    o="tmp";
}