2

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

这是一些示例输出:

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;
}
4

3 回答 3

2

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

这是你打电话的时候getline;读取换行符,并立即返回换行符。

要解决此问题,请在调用getline后立即添加cin >> number调用,并丢弃结果。

于 2013-01-07T02:16:12.930 回答
1

我可以建议你试试吗

std::cin >> names;

代替

getline(std::cin, names);

getline 接受std::endl\n来自您的std::cout打印字符串。这个想法是 getline 将读取直到\n字符(这是结束行的指示),但它也会消耗结束行字符。这就是为什么它将换行符消耗到您的向量中的原因。

考虑这样做。. .

std::cin.get();

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

于 2013-01-07T02:11:18.103 回答
1

问题是将有格式输入 ( 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
}
于 2013-01-07T02:25:53.577 回答