在C ++中使用cin时,用于循环计数被忽略

时间:2015-04-13 07:54:19

标签: c++ input cin

我有一个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
}

当我将其提交到我的大学和GCC的在线编译器时,它会跳过最后一个输入。示例 - 我输入数字8,它只需要7个节点。我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:5)

语句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;
}

运行示例:

Number of nodes?
2xx
Names:
[xx]
aaa
[aaa]

解决这个问题的一种方法是放置:

cin.ignore(numeric_limits<streamsize>::max(), '\n');
紧接在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;
}

明显改善了这种情况:

Number of nodes?
2xx
Names:
aaa
[aaa]
bbb
[bbb]