2016-10-30 4 views
-1

概要:fmt.Scanlnで文字列をキャプチャしていましたが、私のニーズの1つは文字列にスペースが必要で、その文字列内の接尾辞があるかどうかをチェックして置き換えなければならないので、strings.HasSuffixを使用しました。 fmt.Scanlnでキャプチャした文字列では問題はありませんでしたが、reader.ReadStringを使用するようになったので、文字列内の指定された接尾辞を見つけることはできません。strings.HasSuffixをreader.ReadStringでキャプチャした文字列で確認できません

何が起こっているのかについてのヒントはありますか?

問題を特定し、オンラインではなくデスクトップにインストールされたGoで使用するテストです。

package main 

import (
    "bufio" 
    "fmt" 
    "strings" 
    "os" 
    "reflect" 
) 
const TOKEN string = ":=" 

func validate(expr string) { 
    fmt.Println("var type: ", reflect.TypeOf(expr)) 
    if strings.Contains(expr, TOKEN) { 
     fmt.Println(expr, "contains works") 
    } else { 
     fmt.Println("error with contains") 
    } 

    if strings.HasSuffix(expr, TOKEN) { 
     fmt.Println(expr, "suffix works") 
    } else { 
     fmt.Println("error with suffix") 
    } 
} 

func main() { 
    var expr2 string 
    reader := bufio.NewReader(os.Stdin) 
    fmt.Print("type something finished with ':='") 
    expr1, _ := reader.ReadString('\n') 
    fmt.Scanln(&expr2) 

    fmt.Println("validation with reader: ") 
    validate(expr1) 
    fmt.Println() 
    fmt.Println("validation with Scanln: ") 
    validate(expr2) 
} 
+2

[「ReadStringは、デリミタなどに、最大データを含む文字列を返す、入力におけるDELIMの最初の発生まで読み出し」](https://godoc.org/bufio#Reader.ReadString ) –

答えて

1

@Timがreader.ReadString('\n')の出力は、最後の文字として「\ n」を含んでおり、fmt.Scanlnはそれをしません述べたように。 const TOKEN string = ":=\n"を実行するか、文字列の最後から '\ n'を削除します。

更新:

\r\nは通常\n期待の代わりに接尾辞として発生する場合があります

fmt.Scanlnfmt godocあたりとして、同様にそのケースを扱う(Windowsのマシンが?)。

In all the scanning functions, a carriage return followed immediately by a newline is treated as a plain newline (\r\n means the same as \n).

+0

":= \ n"というトークンで試してみましたが、どちらも失敗します。 – Juanpa

+1

@Juanpaは私にとってはうまくいくはずです。あなたは何かを見落とさなければなりません。 – janos

+0

私は、どんな文字列も同じように扱われ、それが捕らえられた方法に無関心であると予想しました。 – Juanpa

関連する問題