29

http://play.golang.org/p/ZsALO8oF3W

文字列をトラバースして文字値を返したい。各文字ごとに数値を返すのではなく、実際の文字を返すにはどうすればよいですか?

今、私はこれを手に入れています

 0 72 72
 1 101 101
 2 108 108
 3 108 108
 4 111 111

私の望ましい出力は

 0 h h
 1 e e
 2 l l
 3 l l
 4 o o

 package main

 import "fmt"

 func main() {

    str := "Hello"
    for i, elem := range str {
        fmt.Println(i, str[i], elem)
    }

    for elem := range str {
        fmt.Println(elem)
    }   
 }

ありがとう、

4

3 に答える 3

56

ステートメントの場合

文字列値の場合、"range" 句は文字列内のバイト インデックス 0 から始まる Unicode コード ポイントを反復します。連続する反復では、インデックス値は、UTF-8 でエンコードされた連続するコード ポイントの最初のバイトのインデックスになります。文字列とルーン型の 2 番目の値は、対応するコード ポイントの値になります。反復で無効な UTF-8 シーケンスが検出された場合、2 番目の値は 0xFFFD (Unicode 置換文字) になり、次の反復で文字列内の 1 バイトが進められます。

例えば、

package main

import "fmt"

func main() {
    str := "Hello"
    for _, r := range str {
        c := string(r)
        fmt.Println(c)
    }
    fmt.Println()
    for i, r := range str {
        fmt.Println(i, r, string(r))
    }
}

出力:

H
e
l
l
o

0 72 H
1 101 e
2 108 l
3 108 l
4 111 o
于 2013-10-07T18:34:13.780 に答える
5

パッケージのメイン Printf を使用して、文字を印刷することを示します。

import "fmt"

func main() {

        str := "Hello"
        for i, elem := range str {
                fmt.Printf("%d %c %c\n", i, str[i], elem)
        }

}
于 2013-10-07T18:09:48.713 に答える
2

文字列内の文字を反復処理する方法は実行可能です (ただし、str[i] と elem は互いに重複しています)。適切なデータがあります。

正しく表示するには、正しいフォーマットで出力する必要があります (つまり、int ではなく Unicode 文字として解釈されます)。

変化する:

fmt.Println(i, str[i], elem)

に:

fmt.Printf("%d %c %c\n", i, str[i], elem)

%cPrintf doc: http://golang.org/pkg/fmt/に従って、対応する Unicode コード ポイントで表される文字です

于 2013-10-07T18:09:11.507 に答える