C++ 在C+中很难可靠地使用cin+;

C++ 在C+中很难可靠地使用cin+;,c++,cin,C++,Cin,我似乎无法想出一段代码来捕获用户,直到它得到一个正整数,并在用户意外键入字符或诸如“-1-3-4-39-32xfi3/”之类的随机垃圾时适当地提示用户。我只是需要一个整洁的防故障cin循环结构,但我无法理解它。谢谢 我只是想知道其他人在控制台输入方面做了些什么来从中汲取灵感。你如何避免错误的输入。这样做: #include <cstdlib> #include <iostream> #include <sstream> #include <string&

我似乎无法想出一段代码来捕获用户,直到它得到一个正整数,并在用户意外键入字符或诸如“-1-3-4-39-32xfi3/”之类的随机垃圾时适当地提示用户。我只是需要一个整洁的防故障cin循环结构,但我无法理解它。谢谢

我只是想知道其他人在控制台输入方面做了些什么来从中汲取灵感。你如何避免错误的输入。

这样做:

#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;
}
#包括
#包括
#包括
#包括
int main()
{
for(std::string-line;std::getline(std::cin,line);)
{
标准::istringstream iss(线);
无符号整数n;
如果(!(iss>>n>>std::ws)| | iss.get()!=EOF)
{

std::cout我通常使用
std::getline
读取整行,然后尝试使用
strtol
将其转换为整数。如果结果小于0,他们键入一个前导的
-
strtol
返回一个指针,指向无法转换为整数的输入的第一个字符,因此如果它指向任何整数g但是
\0
,您知道用户键入了无法转换的内容

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


取决于您的可用性,以及您如何响应不良输入,考虑的另一个可能是Boost < Cord>ListalyCase。如果不能将整个输入转换为目标类型,则抛出异常,因此如果您希望异常,则可能更方便。(但如果你不希望出现异常,这可能只会让你付出额外的工作)。

那么,你想出了哪些“代码块”没有按你预期的方式工作?这看起来像是一个伪装得很差的家庭作业问题。如果你“在玩什么东西”,你应该至少尝试一次解决问题,并将其包含在你的帖子中。请这样做。否则,从:“要求家庭作业帮助的问题必须包括你迄今为止为解决问题所做的工作的摘要,以及你解决问题的难易程度的描述。”我不认为“无法解决”和“玩一些东西”是很重要的。从C++ + FAQ看来,这有点过分了,你不觉得吗?@雷米贝尔:不,它是对的。@ ReMyabel-Relax控制台输入在C和C++中是很难的!