不等待 std::cin.ignore()
Not waiting for std::cin.ignore()
基于this answer,我写了下面的代码
#include <iostream>
#include <vector>
#include <cstddef>
#include <limits>
int main()
{
std::cout << "Enter x and y size, followed by enter: ";
std::size_t nrOfRows, nrOfCols;
std::cin >> nrOfRows >> nrOfCols;
// initialize dynamic array of arrays
std::vector<std::vector<char>> data(nrOfRows,
std::vector<char>(nrOfCols, 'O'));
// print array
for (std::size_t rowNr = 0; rowNr < nrOfRows; rowNr++)
{
std::cout << "Row " << rowNr << ": ";
for (const auto& el : data[rowNr])
std::cout << el << " ";
std::cout << std::endl;
}
std::cout << "Press enter to continue: ";
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
使用 VC++ 14.1 或 Visual studio 2017 v15.7.4 编译。
在第一个提示后,我输入例如“3 5”并输入。然后程序就滚动并退出。例如。它输出字符串并且 不等待 std::cin.ignore()
处的最终用户输入(输入)。
我错过了什么?
编辑
对于 down-voters/nay 发言者。此代码确实按照描述工作。
#include <iostream>
#include <limits>
int main()
{
std::cout << "Press enter to continue: ";
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
您的问题是提取操作 (std::cin >> nrOfRows >> nrOfCols;
) 会在流中留下定界空白,这与 getline()
不同,后者会消耗定界符。这通常不是问题,因为 >>
运算符也会忽略前导空格,但流中留下的换行符会导致 std::istream::ignore()
不等待输入。
要解决此问题,请添加对 std::istream::ignore()
的调用以在输出 Press enter to continue:
消息之前丢弃所有空格。
基于this answer,我写了下面的代码
#include <iostream>
#include <vector>
#include <cstddef>
#include <limits>
int main()
{
std::cout << "Enter x and y size, followed by enter: ";
std::size_t nrOfRows, nrOfCols;
std::cin >> nrOfRows >> nrOfCols;
// initialize dynamic array of arrays
std::vector<std::vector<char>> data(nrOfRows,
std::vector<char>(nrOfCols, 'O'));
// print array
for (std::size_t rowNr = 0; rowNr < nrOfRows; rowNr++)
{
std::cout << "Row " << rowNr << ": ";
for (const auto& el : data[rowNr])
std::cout << el << " ";
std::cout << std::endl;
}
std::cout << "Press enter to continue: ";
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
使用 VC++ 14.1 或 Visual studio 2017 v15.7.4 编译。
在第一个提示后,我输入例如“3 5”并输入。然后程序就滚动并退出。例如。它输出字符串并且 不等待 std::cin.ignore()
处的最终用户输入(输入)。
我错过了什么?
编辑
对于 down-voters/nay 发言者。此代码确实按照描述工作。
#include <iostream>
#include <limits>
int main()
{
std::cout << "Press enter to continue: ";
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
您的问题是提取操作 (std::cin >> nrOfRows >> nrOfCols;
) 会在流中留下定界空白,这与 getline()
不同,后者会消耗定界符。这通常不是问题,因为 >>
运算符也会忽略前导空格,但流中留下的换行符会导致 std::istream::ignore()
不等待输入。
要解决此问题,请添加对 std::istream::ignore()
的调用以在输出 Press enter to continue:
消息之前丢弃所有空格。