关于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,因为它忽略了新输入的带有有效数字的固定行。
输出如下(带有错误)
发布于 2014-12-17 18:41:15
我不认为这些值是用0值放入矩阵中的。相反,它们只是停留在具有值0的矩阵中!本质上,您可以从while-loop处理行中分离出来,这与这些值是否已被成功读取无关。我可能会移动一些条件,避免中间流:这似乎没有什么帮助,因为您并没有真正地进行面向行的输入。
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";
}
}
}发布于 2014-12-17 18:30:44
我认为你需要把getline从while中移出,才能让它正常工作。
举个例子。我没有编,但它应该给你一个大致的想法。
// 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;
}
}
}https://stackoverflow.com/questions/27531834
复制相似问题