在循环中遇到cin函数问题

时间:2013-01-07 02:01:14

标签: c++ loops cin

我只是试图使用循环使用字符串填充数组。我的问题是当它进入循环输入名称时,它会立即为向量中的第一个插槽输入一个空行。为什么会这样?我该如何解决呢?请不要介意我缺乏代码风格,在今年冬天上课之前,我是一个努力重新获得编程知识的菜鸟......

以下是一些示例输出:

How many people are in your family?
4
Please enter the names of all of your family members
check name:
Please enter the names of all of your family members
Matt
check name:Matt
Please enter the names of all of your family members
Evan
check name:Evan
Please enter the names of all of your family members
Michelle
check name:Michelle

Matt
Evan
Michelle

这是我的代码:

vector<string> Names;
bool complete=0;
while(!complete)
{
    int number;
    cout << "How many people are in your family?" << endl;
    cin >> number;

    for(int i=0; i<number; i++)
    {
        string names;
        cin.clear();
        cout << "Please enter the names of all of your family members" << endl;
        getline(cin,names);
        Names.push_back(names);
        cout << "check name:" << names << endl;
    }
    complete = 1;
}

for (int i=0; i< Names.size(); i++)
{
    cout << Names[i] << endl;
}

3 个答案:

答案 0 :(得分:2)

您看到此行为的原因是将>>读取与getline混合。当您读取计数时,输入指针前进到数字输入的末尾,即4,并在读取新行字符之前停止。

这是你致电getline的时候;读取新行字符,立即返回新行。

要解决此问题,请在getline电话后立即拨打cin >> number,并弃掉结果。

答案 1 :(得分:1)

我建议你试试

std::cin >> names;

而不是

getline(std::cin, names);

getline从std::endl打印字符串中获取\nstd::cout。我们的想法是getline会一直读到\n字符(表示结束线),但它也会消耗结束字符。这就是为什么它会在你的向量中使用换行符。

考虑这样做。 。

std::cin.get();

将读取std::endl字符,然后使用getline函数。

答案 2 :(得分:1)

问题是将fonatted输入(std::cin >> number)与未格式化的输入(std::getline(std::cin, names))混合在一起。格式化的输入在第一个非整数字符处停止,很可能是您在计数后输入的换行符。最简单的解决方法是明确跳过前导空格:

std::getline(std::cin >> std::ws, names);

请注意,您还需要在每次输入后检查它是否成功:

if (std::cin >> number) {
    // do something after a successful read
}