6

我是 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
4

2 回答 2

5

使用字符串#scan

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

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

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

如果您想处理换行符以及制表符或空格,您需要做的就是添加m用于多行匹配的标志。例如:

digits = '1
          4 8'.scan /\d+/m
# => ["1", "4", "8"]
于 2013-02-09T11:36:58.977 回答
4

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

所以这里有一个解决方案:

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无论空格如何,此解决方案都将从输入中读取数字。用户可以将它们全部输入一行,或者单独的行,或者两者的混合(我认为这是您最初的要求)。

于 2013-02-09T12:19:28.350 回答