索引超出字符串,红宝石

时间:2018-01-06 19:20:31

标签: ruby string indexing

这是我的代码的一小部分,非常自我解释,它将所有字符从输入复制到temp并跳过空格。

input = gets.to_s.chomp
temp=String.new
for i in 0..input.length-1
  if (input[i]==" ")
    next
  else 
    temp[i]=input[i]
  end  
end
puts "#{temp},END"
gets

然而,我用'hello world'输入测试它,它应该给我helloworld但是我得到了

8:in '[]=':index 6 out of string(IndexError)

意味着问题在跳过空间时开始,出于某种原因。 请记住,如果我放置一个不包含空格的字符串,我不会收到任何错误

3 个答案:

答案 0 :(得分:4)

每当需要字符串操作时,可能需要将字符串转换为其部件的数组,操纵这些部件然后将它们连接回字符串,但more often as not只需操作字符串本身,主要使用类String中的方法。在这里你可以Kernel#puts以下内容。

"%s END" % gets.delete(" \n")
  #=> "helloworld"

String#delete删除Kernel#gets在输入的字符串末尾添加空格和返回字符("\n")。其中一个变体是"%s END" % gets.chomp.delete(" ")

另一种方式是puts

"%s END" % gets.gsub(/\s/, '')
  #=> "helloworld"

正则表达式/\s/会导致String#gsub删除所有空格,其中包括输入的空格(和制表符)以及"\n"所附加的gets字符串的结尾。

答案 1 :(得分:1)

我猜你的错误是由于字符串' hello world'你拒绝"拒绝"空格。在这种情况下,对于正在使用的字符串中的每个空格,temp将少一个。

您可以将input[i]分配给当前temp.size位置的临时变量的空格,这样您就不会跳过索引。

可能是temp[temp.size]或仅使用+=修改临时值。

for i in 0...input.size
  if input[i] == ' '
    next
  else 
    temp[temp.size] = input[i]
  end  
end

请注意,您可以替换for的{​​{1}}循环(Ruby方式):

each

答案 2 :(得分:1)

如果您想跳过输入中的所有空白区域并打印输出,您可以使用单行显示:

puts "#{gets.chomp.split.join}, END"

在ruby中,您几乎不需要使用for构造来编写循环,这与其他传统语言(如Java)不同。