我需要您提供有关getline验证的帮助。我使用矢量创建了2D矩阵,我想用控制台中的值填充2D矩阵。
问题在于验证输入(一行)中的单个值。当我键入例如“d”或任何其他字符时,我的代码将其转换为0并将值放在矩阵中..但这不是我想要的。我希望用户再次键入值(直到它们有效)并将新值放入矩阵中。这是代码:
string number, line;
cin.ignore();
double value = 0;
for(unsigned int i = 0; i < n; i++)
{
while((getline(cin, number, '\n'))) {
cout << "-> ";
stringstream iss(number);
for (unsigned int j = 0; j <= n; j++)
{
if ( !(iss >> value) )
{
cout << "[ERROR] Invalid input. Type a valid number:" << endl;
cin.clear();
cin.ignore(256, '\n');
} else {
A[i][j] = value;
}
}
break;
}
}
//编辑:
我想要完成的是检查输入的行中的值是否为有效数字。例如(输入)
并且输出应该是没有错误行的输入,除了数字之外的随机字符。
现在使用上面的代码,它表示无效输入,但它输出最后一行,错误为0,并且该0后面的跟随数字也是零,因为它忽略了带有效数字的新输入固定行。
输出看起来像(带错误):
答案 0 :(得分:1)
我不认为这些值是 put 到值为0
的矩阵中。相反,它们只是保留在矩阵中,值为0
!从本质上讲,您可以独立于值是否已成功读取而从while
- 循环处理行中脱离出来。我可能会移动一些条件并避开中间流:它似乎没有用,因为你并不真正做面向行的输入。
double value;
for (unsigned int i{0}; i != n && std::cin; ++i) {
for (unsigned int j{0}; std::cin; ) {
if (std::cin >> value) {
A[i][j] = value;
if (++j == n) {
++i;
break;
}
else if (!std::cin.eof()) {
std::cin.clear();
std::string line;
std::getline(std::cin, line); // !std::cin.eof() => this shall be successful!
std::cout << "ERROR invalid number input: ignoring '" << line << "'\n";
}
}
}
答案 1 :(得分:0)
我认为您需要移动getline才能使其正常工作。
这是一个例子。我没有编译它,但它应该给你一个大致的想法。
// To be tested
string number, line;
cin.ignore();
double value = 0;
bool validInput;
for(unsigned int i = 0; i < n; i++)
{
validInput = false;
while(!validInput) {
getline(cin, number, '\n');
std::istringstream iss(number);
iss >> value;
if (!iss.fail() && iss.eof())
{
cout << "[ERROR] Invalid input. Type a valid number:" << endl;
cin.clear();
cin.ignore(256, '\n');
continue;
}
validInput = true;
for (unsigned int j = 0; j <= n; j++)
{
A[i][j] = value;
}
}
}