首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getline验证

getline验证
EN

Stack Overflow用户
提问于 2014-12-17 17:54:22
回答 2查看 766关注 0票数 0

关于getline验证,我需要你的帮助。我使用向量创建了2D矩阵,我想用控制台的值填充这个2D矩阵。

问题在于验证输入中的单个值(一行)。当我键入例如"d“或任何其他字符时,我的代码将其转换为0,并将该值放入矩阵中。然而,这并不是我想要的。我希望用户再次键入这些值(直到它们是有效的),并将新的值放入矩阵中。这是代码:

代码语言:javascript
复制
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
  • 2 2 2
  • 3焦炭3 3
  • 错误输入无效。键入一个有效数字:
  • 3 3 3

它的输出应该和输入时一样,不带随机字符的误差线,而不是数字。

现在,在我上面的代码中,它说输入无效,但是它输出的最后一行错误为0,后面的数字也是0,因为它忽略了新输入的带有有效数字的固定行。

输出如下(带有错误)

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-17 18:41:15

我不认为这些值是用0值放入矩阵中的。相反,它们只是停留在具有值0的矩阵中!本质上,您可以从while-loop处理行中分离出来,这与这些值是否已被成功读取无关。我可能会移动一些条件,避免中间流:这似乎没有什么帮助,因为您并没有真正地进行面向行的输入。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-12-17 18:30:44

我认为你需要把getline从while中移出,才能让它正常工作。

举个例子。我没有编,但它应该给你一个大致的想法。

代码语言:javascript
复制
// 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;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27531834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档