我只是试图使用循环使用字符串填充数组。我的问题是当它进入循环输入名称时,它会立即为向量中的第一个插槽输入一个空行。为什么会这样?我该如何解决呢?请不要介意我缺乏代码风格,在今年冬天上课之前,我是一个努力重新获得编程知识的菜鸟......
以下是一些示例输出:
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;
}
答案 0 :(得分:2)
您看到此行为的原因是将>>
读取与getline混合。当您读取计数时,输入指针前进到数字输入的末尾,即4,并在读取新行字符之前停止。
这是你致电getline
的时候;读取新行字符,立即返回新行。
要解决此问题,请在getline
电话后立即拨打cin >> number
,并弃掉结果。
答案 1 :(得分:1)
我建议你试试
std::cin >> names;
而不是
getline(std::cin, names);
getline从std::endl
打印字符串中获取\n
或std::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
}