我有一个for循环设置,根据用于此深度优先搜索算法的邻接列表的节点数,接受用户输入X次.
int nodeNum;
cout << "Number of nodes?: " << endl;
cin >> nodeNum;
cout << "Names: " << endl;
for (int i = 0; i < nodeNum; i++)
{
getline(cin, tempName);
v.push_back(tempName); //pushing the name of node into a vector
}
Run Code Online (Sandbox Code Playgroud)
当我将其提交到我的大学和GCC的在线编译器时,它会跳过最后一个输入.示例 - 我输入数字8,它只需要7个节点.我怎样才能解决这个问题?
该语句cin >> nodeNum读取整数,而是立即离开该文件指针后的整数,但之前的换行符.
因此循环的第一次迭代将该换行读作第一行.你可以看到这个效果:
#include <iostream>
using namespace std;
int main(void) {
int nodeNum;
string tempName;
cout << "Number of nodes?\n";
cin >> nodeNum;
cout << "Names:\n";
for (int i = 0; i < nodeNum; i++)
{
getline(cin, tempName);
cout << "[" << tempName << "]\n";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
与示例运行:
Number of nodes?
2xx
Names:
[xx]
aaa
[aaa]
Run Code Online (Sandbox Code Playgroud)
解决这个问题的一种方法是:
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Run Code Online (Sandbox Code Playgroud)
紧接着cin >> nodeNum- 这将清除字符直到当前行的结尾.您需要包含<limits>头文件才能使用它.
将该更改应用于上面的示例代码:
#include <iostream>
#include <limits>
using namespace std;
int main(void) {
int nodeNum;
string tempName;
cout << "Number of nodes?\n";
cin >> nodeNum;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Names:\n";
for (int i = 0; i < nodeNum; i++)
{
getline(cin, tempName);
cout << "[" << tempName << "]\n";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
明显改善了这种情况:
Number of nodes?
2xx
Names:
aaa
[aaa]
bbb
[bbb]
Run Code Online (Sandbox Code Playgroud)