ruby如何在scanf样式中读取用户输入,就像在C ++中一样

时间:2013-02-09 11:09:25

标签: c++ ruby scanf

我是Ruby的新手。 我需要从用户输入(n)数字读取,在C ++中我使用此代码

for(i=0;i<N;i++)
{
  scanf("%d",&array[i]);
}

此代码读取由任何空格(制表符,空格,换行符)分隔的完全(n)数字。

我如何在红宝石中做到这一点?

在Ruby中我试图像这样做

require 'scanf'
n = scanf("%d");
arr = Array.new()
n.times { arr << scanf("%d") }

但是这个代码在我输入这样的字符串时不起作用:

1   4    8

但如果我输入

,则工作正常
1
4
8

2 个答案:

答案 0 :(得分:4)

使用String#scan

我不是百分百肯定我知道你真的想在这里做什么。如果您只想扫描字符串中的数字,可以使用String#scan执行以下操作:

digits = '1   4    8'.scan /\d+/
# => ["1", "4", "8"]

这将返回字符串中的数字数组,您可以使用您喜欢的任何ArrayEnumerable方法访问数字数组。

如果要处理换行符以及制表符或空格,您只需添加m标志即可进行多行匹配。例如:

digits = '1
          4 8'.scan /\d+/m
# => ["1", "4", "8"]

答案 1 :(得分:4)

不得不承认,在这个例子中,我无法制作一个与C ++版本一样紧凑的程序。在Ruby scanf中似乎不像IO流的C ++版本那样工作,对于字符串,您需要提供一个块来实现每行多次扫描。

所以这是一个解决方案:

a = Array.new
n = gets.to_i

while a.length < n
  gets.scanf("%d") { |d| a << d[0] }
end

您遇到的唯一问题是,如果您请求示例3个号码,然后用户在一行上输入10个号码,则a将包含所有这10个号码。要修复它,您可以在循环完成后始终截断数组:

a = a.take(n)

此解决方案将从输入中读取n个数字,无论空格如何。用户可以在一行,或在单独的行上输入所有内容,或两者的混合(我假设是您的原始要求)。