循环不会中断,字符串不会正常大写?

时间:2014-02-11 00:50:41

标签: ruby eclipse loops break upcase

我试图让一个简单的Ruby程序正确运行。

我需要它来接受用户输入,直到用户键入q以“退出”。它还需要将用户输入的最后四个字母大写,并在四个字母下输入,以大写所有字母。

它仅适用于四个字母的输入,当我输入“quit”时,它会出现nil错误。

请参阅下面的代码。

我在Eclipse 2.0中使用Eclipse。

puts ("\n" * 10)

loop do

  puts "Please enter a word. (To quit type q.)"   # Gets the users input

  puts ("\n" * 3)               #Scroll the screen 3 times

  str = gets.chomp              #Collect the player's response

  puts ("\n" * 3)               #Scroll the screen 3 times

  length = str.length           # Counts length of string

  str = str[0..(length-5)] + str[(length-4)..length].upcase # Only makes last four letters of user input capitalized

  puts str                      # Shows on screen the user input with capitalized last four letters

  puts ("\n" * 3)               #Scroll the screen 3 times

  break if str == "q"

end

2 个答案:

答案 0 :(得分:2)

当你编写这样的代码时,你需要注意[]

str = str[0..(length-5)] + str[(length-4)..length].upcase

如果索引为负数,则从字符串末尾开始计算。例如:

str = "abcde"
str[-1] # => "e"
str[-2] #=> "d"

有关详细信息,请参阅String.[]

关于你的问题,这是我的逻辑:

break if str == "q"

if str.length < 4
  str = str.upcase
else
  str = str[0...-4] + str[-4..-1].upcase
end
p str

答案 1 :(得分:0)

你需要对你的长度进行一些检查。如果长度小于4,则长度 - 5将返回负数和您的

str[0..(length-5)] + ...

行会不高兴。例如。如果输入“str”,那么您的代码将尝试执行:

length = 3

str[0..-2] + str[-1..3]

这没有意义。此外,由于您在最后检查str ==“q”,这可能也发生在“q”。在块中移动您的支票并分手,并确保您不会将所有字符串视为超过4个字符。