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") }

しかし、次のように文字列を intut すると、このコードは機能しません。

1   4    8

しかし、これを入力すると正常に動作します

1
4
8
4

2 に答える 2

5

文字列#スキャンを使用

ここであなたが本当に何をしたいのか、100% わかっているわけではありません。文字列の数字をスキャンしたいだけなら、String#scanを使って次のようにすることができます:

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

これにより、文字列で見つかった数字の配列が返され、好きなArrayまたはEnumerableメソッドを使用して数字配列にアクセスできます。

タブやスペースだけでなく改行も処理したい場合はm、複数行一致のフラグを追加するだけです。例えば:

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

この場合、C++ バージョンほどコンパクトなプログラムを作成できないことを認めざるを得ません。Rubyでは、ストリームの場合scanfは C++ バージョンのように機能しないようIOです。また、文字列の場合は、行ごとに複数のスキャンを実現するためにブロックを提供する必要があります。

したがって、ここに1つの解決策があります:

a = Array.new
n = gets.to_i

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

ここで発生する唯一の問題は、たとえば 3 つの数字を要求し、ユーザーが 1 行に 10 個の数字を入力するaと、それらの 10 個の数字すべてが含まれることです。それを修正するには、ループが完了した後、常に配列を切り捨てることができます:

a = a.take(n)

このソリューションはn、空白に関係なく、入力から数値を読み取ります。ユーザーは、それらすべてを 1 行、別の行、または両方を組み合わせて入力できます (これが最初の要件だったと思います)。

于 2013-02-09T12:19:28.350 に答える