getline验证

时间:2014-12-17 17:54:22

标签: c++ validation matrix getline

我需要您提供有关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;
    }
}

//编辑:

我想要完成的是检查输入的行中的值是否为有效数字。例如(输入)

  • 1 1 1 1
  • 2 2 2 2
  • 3 char 3 3
  • [错误]输入无效。输入有效的号码:
  • 3 3 3 3

并且输出应该是没有错误行的输入,除了数字之外的随机字符。

现在使用上面的代码,它表示无效输入,但它输出最后一行,错误为0,并且该0后面的跟随数字也是零,因为它忽略了带有效数字的新输入固定行。

输出看起来像(带错误)

  • 1 1 1 1
  • 2 2 2 2
  • 3 0 0 0

2 个答案:

答案 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;
        }
    }
}