2013-03-31 1 views
0

간단한 대체 암호 (a = b, b = c 등)를 사용하여 일반 텍스트 메시지를 암호 텍스트 메시지로 변환하는 코드를 작성했습니다. 공백은 "1"로 대체되었습니다.Does는 여분의 공백, 문자 return 또는 nil이있는 문자열을 생성합니까?

그런 다음 'gets'를 사용하여 다른 메시지를 입력 할 수 있도록하고 싶습니다. 이로 인해 "gets"를 "gets.strip"으로 대체하여 해결 한 문제가 발생했습니다. 가져 오기가 입력 된 문자열에 시작 또는 끝 부분에 공백을 추가하는 경우 왜 문제가 발생 했습니까? 나는 공간을 다루는 방법을 가지고 있었고, 실제로는 그것을 ""사용하는 것인가, 아니면 더 나은 단어가 없기 때문에 무의미한 공간인가 아니면 문자를 반환 할 것인가?

base_alph =[" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] 
code_alph = ["1", "z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y"] 
x=0 
base_msgarray = [] 
code_msgarray = [] 
puts "type what you want to translate below" 
base_msg = gets.strip # without the .strip the program doesn't run 
msg_size = base_msg.length 
puts "the message is translated as:" 

loop do #this section populates an array with all the characters from the gets 
break if x >= msg_size 
base_msgarray.push(base_msg[x]) 
x += 1 
end 
# this section passes in the values of the base_msgarray to |letter| to then determine its key 
# in base_alph then that key is passed into code_alph to find the translated letter which 
# is then used to populate the code_msgarray 
base_msgarray.each do |letter| 
code_index = base_alph.index(letter) 
code_msgarray.push(code_alph[code_index]) 
end 
# this section displays the values of code_msgarray in a more text-like fashion 
code_msgarray.each do |codeletter| 
print codeletter 
end 
gets # for some reason if i dont have this here the terminal window disappears before I can read anything 
+0

실제 입력 값과 예상 출력 및 코드 생성의 잘못된 부분을 알려주십시오.차례 차례로 우리는 당신을 빨리 도울 수 있습니다. –

답변

0

문제는 이것입니다. 스트립을 사용하지 않으면 입력에 줄 바꿈 문자가 추가됩니다. 예

type what you want to translate below 
rubyisgreat 

base_msg의 값 gets.strip이 때문에, 스트립 이와 같이

"rubyisgreat\n" 

없이

"rubyisgreat" 

base_msg의 값을 사용하는 "\ n"인 경우하지 않는다 암호 배열에 속하며 그 색인을 줄에 묻습니다.

code_index = base_alph.index(letter) 

은 nil을 생성합니다. 이 줄은 다음 줄에 사용됩니다.

code_msgarray.push(code_alph[code_index]) 

따라서 오류!

다음은 팁입니다. 'p base_msg'를 사용하여의 정확한 값을 검사하십시오. 하나 더. 당신은 루비를 사용하고 있을지 모르나 당신은 그것을 배워야합니다. 이 프로그램은 루비로 작성된 C입니다. 루비가 아니라. 배열 대신 해시를 사용하십시오. 가능하면 루프를 사용하지 마십시오.

+0

통찰력있는 답변 주셔서 감사합니다. 나는 당신의 제안에 감사하지만 나는 그것을 구현하는 방법을 알기에 나의 지식이 충분하지 않다는 것을 두려워한다. (나는 루비를 시작으로 프로그래밍을 가르치려고하고있다. 어제는 그것에 대한 첫 번째 진출이었다.) 내 이해는 배열이 값의 순서를 유지하는 것입니다 (중요한 것은 여기 있습니다. 원래 메시지로 다시 번역 할 때 텍스트를 원함) 반면 해시는 값의 순서가 뒤죽박죽이 될 수 있습니다. 루프가하는 한, 나는 그것을하는 다른 방법을 생각하려고 노력할 것이다. 나는 그것을 배우기 위해 lynda.com "Ruby Essential Training"비디오를 사용하고 있습니다. –

+0

값이 혼란스러워지는 것에 대해 걱정할 필요가 없습니다. 암호 텍스트와 평문 사이에는 여전히 일대일 대응이있을 것입니다. –

0

fine manual에서 : : 이것은 내가 쓴 것입니다

가져 SEP (= $ /) 문자열 → 또는 전무
[...]

반환 (그리고 (또는 $*)에있는 파일 목록의 다음 줄을 지정하거나 명령 줄에 파일이 없으면 표준 입력에서 가져옵니다. 파일 끝에 nil을 반환합니다. 선택적 인수는 레코드 분리 기호를 지정합니다. 구분 기호는 각 레코드의 내용과 함께 포함됩니다.

마지막 문장에 유의하십시오. 레코드 구분 기호는 각 레코드의 내용에 포함됩니다. 기본적으로 레코드는 EOL (일반적으로 라인 피드 또는 캐리지 리턴/라인 피드 쌍)이므로 별도의 문자열에서 \n을 얻을 수 있습니다.

strip 전화는 앞뒤 공백 (CR 및 LF 문자 포함)을 제거하므로 문제가 없어집니다. 또 다른 일반적인 접근 방법은 chomp을 사용하여 후행 $/ 레코드 구분 기호가있는 경우 제거하는 것입니다.

+0

시간 내 주셔서 감사합니다. 감사합니다! –