【问题标题】:Using std::cin in a while loop to read multiple numbers while they're being added (Loop won't terminate)在 while 循环中使用 std::cin 在添加多个数字时读取它们(循环不会终止)
【发布时间】:2021-03-27 23:13:34
【问题描述】:

我正在用 C++ 入门做练习 1.16(第 17 页)。练习是从用户输入(std::cin) 中获取一组数字并将它们相加并输出(std::cout)。我的循环不会以std::cin >> input 作为条件终止。一旦它用完要添加的数字,它就会再次从键盘读取。

我对 C 有点熟悉,在那种语言中我相信我们可以做类似while (input != \n) 的事情,但我不知道缓冲区末尾的字符对于std::cin 是什么。 std::cin 中的终止/最后一个值是什么?为什么它在我的情况下不起作用?

#include<iostream>

int main()
{
    int x = 0;
    int sum = 0;
    std::cout << "Enter a set of integers: " << std::endl;
    while (std::cin >> x)
        sum += x;
    
    std::cout << "The sum of those integers is " << sum << std::endl;

    std::cin.get();
    std::cin.get();
    return 0;
}

【问题讨论】:

  • 在 Windows 上尝试 Ctrl+Z 或在 Linux 上尝试 Ctrl+D。
  • 输入不是整数的东西可能也可以。
  • 您实际上希望程序如何确定没有更多的数字?您是否正在寻找用户不再输入的信号?或者你想获取 line 的输入并从中提取整数?还是别的什么?
  • 练习是使用 std::cin 读取用户的输入(本书中只有此时学习的输入)。我假设新字符行像 c 中一样返回 -1,并且会终止循环,但显然这里是错误的。我希望它在从输入缓冲区读取换行符时终止。
  • 这可能会有所帮助。 stackoverflow.com/questions/38978266/…

标签: c++


【解决方案1】:

我希望它在从输入缓冲区读取换行符时终止

在这种情况下,我会使用std::getline 将该行读取为std::string,然后使用转换函数之一将该字符串转换为整数,例如std::stoi

#include <string>

// ...

    //            exit the for loop if an empty line is entered
    for(std::string line; std::getline(std::cin, line) && not line.empty();) {
        try {
            x = std::stoi(line);
            sum += x;
        }
        catch(const std::exception& ex) {
            // stoi can throw std::invalid_argument and std::out_of_range
            std::cerr << line << ": " << ex.what() << '\n';
        }
    }

如果您希望能够在每行中输入多个数字,可以将使用 std::getline 读取的行放入 std::istringstream 并从中提取数字:

#include <sstream>
#include <string>

// ...

    for(std::string line; std::getline(std::cin, line) && not line.empty();) {
        std::istringstream is(line);
        while(is >> x) {
            sum += x;
        }
    }

【讨论】:

  • 所以换句话说,如果没有新知识或不考虑具体情况,就无法进行我所指的这个练习?不管怎样,你的答案是最好的。谢谢。
  • @Spellbinder2050 不客气!我自己没有这本书,所以我不确定它到底在说什么,但是将行读取为字符串,然后使用一些函数或istringstream 来提取值是解决这类问题的一种非常常见的技术。跨度>
【解决方案2】:

如果您仍然想输入与用户输入一样多的数字,您可以输入字符串并检查输入是否是这样的数字(可能需要一些调整):

int main()
{
    int x = 0;
    int sum = 0;
    std::string input;
    std::cout << "Enter a set of integers: " << std::endl;
    while (std::cin >> input){
        if( isdigit(input) ){ //may need to be "if( std::isdigit(input) ){"
            x = std::stoi(input);
            sum += x;
        }
        else{
            break;
        }
    }
    std::cout << "The sum of those integers is " << sum << std::endl;

    std::cin.get();
    std::cin.get();
    return 0;
}

【讨论】:

  • isdigit 用于判断一个字符,而不是整个字符串。
  • 哎呀,你是对的。但是您可以使用相同的原理,只使用第一个字符。
猜你喜欢
  • 2015-12-02
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2017-06-21
相关资源
最近更新 更多