在C ++中使用cin有很多麻烦

时间:2014-12-16 23:20:13

标签: c++ cin

我似乎无法想出一大堆代码来捕获用户,直到它获得肯定的int并且如果用户意外地输入一个字符或随机垃圾如“-1-3-4-”则提示用户39-32xfi3 /”。我只需要一个整洁的防故障cin循环结构,无法搞清楚。感谢。

我只是想知道其他人在控制台输入方面做了什么,以便从中获取绘制的想法。如何绕过糟糕的输入。

2 个答案:

答案 0 :(得分:6)

这样做:

#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>

int main()
{
    for (std::string line; std::getline(std::cin, line); )
    {
        std::istringstream iss(line);
        unsigned int n;

        if (!(iss >> n >> std::ws) || iss.get() != EOF)
        {
            std::cout << "Bad input ('" << line << "'), ignoring.\n";
            continue;
        }

        std::cout << "Success! We read: " << n << "\n";
        return EXIT_SUCCESS;
    }

    std::cout << "Premature end of input!\n";
    return EXIT_FAILURE;
}

换句话说,继续读取用户的输入,直到您能够将输入解析为所需的数据类型。我选择了基于行的处理,这通常是最自然的,但是如果不正确就可以跳过任何“记录”的概念。请注意,程序可能永远不会成功,即如果用户拒绝提供任何良好输入。

答案 1 :(得分:0)

我通常使用std::getline读取整行,然后尝试将其转换为strtol的整数。如果结果小于0,则会键入前导-strtol返回指向输入的第一个字符的指针,该指针无法转换为整数,因此如果它指向除\0之外的任何字符,则表示用户输入了无法输入的内容。转换。

我真的应该转而使用std::stoi而不是strtol。它支持几乎相同的功能,但其输入为std::string,而不是strtol使用的C风格字符串。我只是继续使用strtol出于长期习惯,而不是因为它确实是一个更好的解决方案。

根据您的可用内容以及您希望如何响应不良输入,另一种可能性是lexical_cast。如果它不能将整个输入转换为目标类型,则抛出异常,因此如果您想要例外,它可能更方便(但如果您不想要例外,它可能只是因为你额外的工作。)