【问题标题】:Lambda auto with input function in c++ giving errorsLambda auto 与 C++ 中的输入函数给出错误
【发布时间】:2018-04-28 03:53:56
【问题描述】:

我正在尝试制作一个类似于 python input() 中的输入函数,但由于函数返回变量的方式,它们必须采用函数类型 void, int, std::string 的格式,因此当用户输入一行时,它被设置它必须返回的内容(IE int print() 意味着返回也必须是 int 所以 9 = 57)。这是我当前的代码状态,以及我想要发生的事情与正在发生的事情的示例。

//Input
auto input = [](const auto& message = "") {
    std::cout << message;
    const auto& x = std::cin.get();
    return x;
};

const auto& a = input("Input: ");
print(a);

当我在控制台中输入 9 时,使用当前代码返回 a 作为 57。我希望它会简单地返回它 9 但这显然不是int,因为我在键盘上输入了它。它还将输入“字符串”返回为 115,我不知道为什么会这样。最终我希望它像 pythons input() 一样运行并将它作为字符串返回。 9 = 9 和'字符串' = '字符串。

【问题讨论】:

    标签: c++ input lambda return auto


    【解决方案1】:

    如果你想要像 python input() 这样的东西,我认为你应该在这种情况下硬编码 std::string 类型。

    auto input = [](const std::string& message = "") {
        std::cout << message;
        std::string x;
        std::cin >> x;
        return x;
    };
    //print can be auto to be more generic
    auto print = [](const auto& message) {std::cout << message << std::endl;};
    auto a = input("Input: "); //a is a string 
    print(a); 
    

    如果你输入一个 int,并且想要返回一个 int,你可以使用 stoi 来转换它

    auto b = std::stoi(input("Input: ")); //convert string to int, and b is an int
    print(b); 
    

    更新 由于 python input 一次读取整行,但是 std::cin &gt;&gt; x; 只会读到第一个空格,

    std::getline(std::cin, x);//This will read the whole line including spaces
    

    可能是更好的解决方案。

    【讨论】:

    • 甜蜜!有没有办法让std::cin 在按下输入时不接受输入并关闭?目前它将继续询问,直到输入一个字符(空格不包括)。请注意,在 python 中,无论何时按下 enter,它都会关闭
    • std::cin::operator&gt;&gt;() 默认情况下只会从字符串中提取第一个标记,例如停在第一个空白处。这也会吞噬换行符(即空格),因此您无法捕捉到它。
    • @Mose 我认为std::getline(std::cin, x) 可以胜任!我已经更新了我的答案,如果您正在寻找它,请告诉我
    • @Mose 实际上看到了 jmc 的答案。它更接近于 python 输入。
    【解决方案2】:

    std::cin.get(); 提取一个字符并将其ascii value 作为int 返回。

    const auto&amp; x = std::cin.get();,插入'9',返回'9'的ascii值,即57

    【讨论】:

      【解决方案3】:

      '9' != 9.

      在您的情况下(ascii),'9'54
      同样's'"string" 的第一个字符)是115

      const auto&amp; x = std::cin.get(); 返回一个int。所以你的 lambda 返回一个 int,然后将你的字符打印为 int

      你可以使用std::string:

      std::string s;
      std::cin >> s;
      return s;
      

      【讨论】:

      • 谢谢!这作为一个函数工作,但我希望它像 pythons 版本一样工作。在这种情况下,您必须进行输入,否则当您按 Enter 时它会不断地再次询问,(由于某种原因,空格也不算作字符。)。如果在没有输入的情况下按 Enter 键,它将继续在 python 中的哪个位置。使用.get() 方法可以做到这一点,但只记录第一个字符作为@Gill Bates 提到的。有没有办法实现这一点?
      【解决方案4】:

      如果您想要更接近实际 Python 的 input() 函数的行为(实际上是 raw_input(),因为在这种情况下无论如何您都无法评估 Python),您可以执行以下操作:

      using EOFError = std::exception;
      
      template <typename T = std::string>
      std::string raw_input(T prompt = {}) {
        std::cout << prompt;
        std::string line;
        if (!std::getline(std::cin, line)) {
          throw EOFError();
        }
        return line;
      }
      

      这还将检测您何时收到 EOF(当getline() 操作的流不再有效时 - 理想情况下,您应该在此处检查eofbit)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多