【问题标题】:In C++, what's an easy way to extract integers from standard input? [duplicate]在 C++ 中,从标准输入中提取整数的简单方法是什么? [复制]
【发布时间】:2015-09-12 13:57:00
【问题描述】:

我是一个遇到常见问题的初学者。我试图在 C++ 中逐行读取标准输入,其中每一行是 [integer][comma][integer]。例如:

1,1
2,3
12,5

等等。我只想在每一行中使用整数并将它们分配给单独的变量。困扰我的代码部分如下所示:

int x,y;
for (string line; getline(cin, line); ) {
   // ...want to have something like
   // x = first integer, y = second integer
   // process x and y
}

所以本质上,我不关心在每一行存储整数的值,但我确实想处理每对整数以比较它们或诸如此类。

我注意到其他使用向量、字符串流、标记和/或分隔符的解决方案,但这些几乎总是用于每行有多个分隔符的输入行 - 这里我们每行只有 1 个,所以我认为可能有更简单的解决方案。

感谢您的时间和耐心。

【问题讨论】:

  • getline 加上正则表达式匹配将处理简单和复杂的情况。

标签: c++


【解决方案1】:

试试这个:

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

// ...

for (std::string line; std::getline(std::cin, line); )
{
    std::istringstream iss(line);
    int x, y;
    char c;
    if (!(iss >> x >> c >> y >> std::ws) || iss.get() != EOF || c != ',')
    {
        std::cerr << "Cannot parse line '" << line << "'.\n";
        continue;
    }

    std::cout << "Input: " << x << ", " << y << "\n";
}

(此逻辑实际上允许比您在示例中给出的更宽松的输入(关于空格);如果您希望匹配严格,则不必跳过空格。)

【讨论】:

  • 谢谢你,这很完美!我还注意到您是如何在 for 循环中声明 x 和 y 的,并打算对其提出质疑,但它引导我阅读范围约定(我之前认为如果在循环外声明一次变量可能会更快)。我正在学习吨:)
【解决方案2】:

要从标准输入读取,您可以使用cin 命令。将输入读取为 string 并相应地对其进行解析以获取输入。

但是,您在此处输入的是预定义格式,我们可以通过使用 scanf 来利用它。您的代码如下:

int x,y;
while (scanf("%d,%d",&x,&y) == 1) 
{
  ...
  ...
}

%d,%d 表示 scanf 正在寻找整数形式的输入,然后是逗号,然后是整数。如果输入不是指定的格式,scanf(...) == 1 将评估为 false,如果用户按 Enter 两次(或提供其他输入),将有助于退出 while 循环。

【讨论】:

  • 这是一个有趣且外观优雅的解决方案,我想到的是这样的,虽然它对我不起作用 - 当我尝试实现它时,它要么只读取 1行并完成,或者它读取每一行但只能用 Ctrl+C 关闭(尽管这几乎可以肯定是因为我在实现中做错了什么)。谢谢!
  • @Klogg:很高兴你喜欢它。有可能我也做错了,因为我没有验证这个代码,也没有使用太多的scanf。对我而言,while 循环的终止可能是不正确的。不过,在网上搜索一下有关 scanf 应该会得到正确的答案。
猜你喜欢
  • 2011-12-11
  • 2019-07-31
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多