代码之家  ›  专栏  ›  技术社区  ›  Agile_Eagle

在C++中读取未知数量的输入

  •  1
  • Agile_Eagle  · 技术社区  · 7 年前

    我正在学习C++使用的书C++入门。

    第1.4.3节 ,下面给出了有关读取未知输入数的示例代码。

    #include <iostream>
    int main()
    {
      int sum = 0, value = 0;
      // read until end-of-file, calculating a running total of all values read
      while (std::cin >> value)
      sum += value; // equivalent to sum = sum + value
      std::cout << "Sum is: " << sum << std::endl;
      return 0;
    }
    

    根据这本书,如果我们输入 3 4 5 6 ,输出将为 Sum is: 18

    但是当我在我的电脑上尝试这个的时候( 带MingW的Windows 10 ,代码不会结束。即使我输入了换行符,它也会不断地请求输入。只有当我输入一个非int输入 f .


    这是预期的吗?如果是,输入换行符后是否有停止的代码?

    我对C++非常陌生,而且我已经学会了Python,所以这么早就被卡住是非常令人沮丧的。


    谢谢和问候。

    3 回复  |  直到 6 年前
        1
  •  5
  •   Remy Lebeau    7 年前

    您需要以文件结尾字符(即 CTRL Z 在Windows上, 小精灵 在mac/unix上),而不仅仅是在行尾(即 进入 )

    一个简单的 进入 被解释为空白,这将被 operator>> 当读取到整数数据类型时。

    CTRL Z /相反,文件末尾 运营商>> 因错误而失败。

    this SO answer .

    注:输入 f 也将终止循环,因为 F 不被视为有效的整数;因此, std::cin >> value 具有 value 类型 int 像这样的输入 F 也会失败。更准确地说: 运营商>> 实际上返回对输入流的引用,但是如果读取值失败, failbit 在流上设置,然后在布尔表达式中解释流对象(隐式调用 basic_istream::operator bool() )回报 false ;所以也许这本书的作者不想在书中的相应章节解释这些细节:-)

        2
  •  2
  •   JeJo    7 年前

    这是预期的吗?

    是的 ,那就是 while (std::cin >> value) 做。有关更多解释,请参见此答案: How is "std::cin>>value" evaluated in a while loop?

    输入换行符后是否有停止的代码?

    作为 >> 只需忽略一个空格(stephanlechner也提到过)

    你可以做的是:

    1. 只要给出一个条件;如果它满足 break 循环。你 也可以提供一个控制台,使其更易于理解 用户。例如:

      std::cout << "Enter value to sum or press -1 to exit" << std::endl;
      
      while (std::cin >> value && value != -1) // if value == -1, loop stops.
      {
          sum += value;
      }
      
    2. 您只需在字符结尾处终止:

      • CTRL Z 在Windows上
      • CTRL—D 在Mac/Unix上
        3
  •  1
  •   Remy Lebeau    7 年前

    这是预期的吗?

    是的,作为 operator>> 默认情况下忽略前导空白,包括换行符。

    如果是,输入换行符后是否有停止的代码?

    使用 std::cin.getline() std::getline() 而不是 运营商>> . 你可以用 运营商>> 用一个 std::istringstream

    #include <iostream>
    #include <string>
    #include <sstream>
    
    int main()
    {
        std::string line;
        int sum, value;
    
        do
        {
            std::cout << "Enter a set of numbers, or a blank line to exit: ";
            if (!std::getline(std::cin, line) || line.empty())
                break;
    
            // read until end-of-line, calculating a running total of all values read
            std::istringstream iss(line);
            sum = 0;
            while (iss >> value)
                sum += value; // equivalent to sum = sum + value
    
            std::cout << "Sum is: " << sum << std::endl;
        }
        while (true);
    
        return 0;
    }
    

    Live Demo