2016-11-05 2 views
-1

나는 Go 내 발가락을 담그고 오전 Y 또는 N가 입력되었는지 확인하기 위해 몇 가지 코드를 작성했습니다 : 나는 & 유형 y (키를 누릅니다 입력)이 코드를 실행하면내 lang 문자열 비교가 예상대로 작동하지 않는 이유는 무엇입니까?

reader := bufio.NewReader(os.Stdin) 
fmt.Print("(y/n): ") 
text, _ := reader.ReadString('\n') 
text = strings.ToLower(text) 

if strings.Compare(text, "y") == 0 { 
    fmt.Println("True") 
} else { 
    fmt.Println("Else") 
} 

내가에 기대 True을 참조하십시오. 그러나 나는 Else을 얻었습니다 - 아무도 볼 수 있습니까? 주석 위, ReadString() 문자열의 한 부분으로 구분 기호를 반환 말했듯이

reader := bufio.NewReader(os.Stdin) 
fmt.Print("(y/n): ") 
text, _ := reader.ReadString('\n') 
text = strings.ToLower(text[0:len(text)-1]) 

if strings.Compare(text, "y") == 0 { 
    fmt.Println("True") 
} else { 
    fmt.Println("Else") 
} 

:

+4

[ "ReadString은 입력에서 delim이 처음 나타날 때까지 읽습니다. 단락 기호까지 데이터가 포함 된 문자열을 반환합니다"] (https://godoc.org/bufio#Reader.ReadString) –

답변

4

당신은 가장 가능성 같은 것을 원한다. 따라서 "y \ n"을 얻고 "y"와 비교하면 결과가 false입니다. (대신 Trim() 함수를 사용하여 입력의 양쪽에서 모든 공백을 제거 할 수 있습니다!)

편집 : Trim() 제안은 항상 원래 제안보다 선호되어야합니다. 그렇게하지 않으면이 답변의 주석에 설명 된 것처럼 이식성이없는 코드가 생성됩니다. 전체 수정 된 코드 : @TimCooper으로

reader := bufio.NewReader(os.Stdin) 
fmt.Print("(y/n): ") 
text, _ := reader.ReadString('\n') 
text = strings.ToLower(strings.Trim(text," \r\n")) 

if strings.Compare(text, "y") == 0 { 
    fmt.Println("True") 
} else { 
    fmt.Println("Else") 
} 
+0

감사합니다. 이걸 시도했지만 똑같은 결과가 나옵니까? –

+1

나를 위해 작동합니다. 실제로 C & P의 변경 사항을 수정 된 코드로 테스트했습니다. – BadZen

+1

(윈도우에있을 수도 있고, ReadString() 반환 값에 MS 스타일 \ r을 가져올 수 있습니까? 그렇다면 -1을 -2로 변경하거나 더 좋게 - Trim() 함수를 다음과 같이 사용하십시오. – BadZen

3

주석, "ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter"에서 지적했다. 즉, 구분 기호가 \n이므로 text 읽기에 포함되므로 비교할 때 고려해야합니다.

다른 대답에 대한 토론에서 알 수 있듯이 \n을 제거하는 것만으로는 충분하지 않습니다. 이는 사용자 입력의 줄 끝이 stdin에서 운영 체제에 따라 다를 수 있기 때문일 수 있습니다. 유닉스에서는 \n, 윈도우에서는 \r\n입니다. 다음은 더 휴대용 솔루션입니다 :

if strings.TrimRight(text, "\r\n") == "y" { 

내가 직접 "y"과 더 직접적인 단순 비교에 strings.Compare의 사용을 변경했습니다.

관련 문제