2016-11-05 4 views
-1

私はGoと私のつま先を浸漬していますし、YまたはNが入力されているかどうかを確認するためにいくつかのコードを書かれている:私は&タイプy(と入力し、Enterキーを押します)このコードを実行すると私のgo lang stringの比較が期待どおりに動作しないのはなぜですか?

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()の提案は、常に元の提案よりも優先されるべきです。そうしないと、この回答へのコメントに示されているように、移植性のないコードが生成されます。完全な改訂コード:

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

@TimCooperは、コメントに "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の読み込みに含まれますので、比較するときはそれを考慮する必要があります。

もう1つの答えの説明から明らかなように、単に\nを取り除くだけでは不十分です。これは、ユーザー入力の末尾がstdinから、オペレーティングシステムによって異なることが考えられます。 UNIXの場合は\n、Windowsの場合は\r\nです。ここで は、よりポータブルなソリューションです:

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

私も直接"y"とのより直接的な、単純な比較にstrings.Compareの使用を変更しました。

関連する問題