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 编码代码点的第一个字节的索引rune 类型的字符串和第二个值将是相应代码点的值。如果迭代遇到无效的 UTF-8 序列,则第二个值将是 0xFFFD,即 Unicode 替换字符,并且下一次迭代将在字符串中前进一个字节。

例如,

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

package main 使用 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 是彼此重复的)。你有正确的数据。

为了让它正确显示,您只需要以正确的格式输出(即解释为 unicode 字符而不是 int)。

改变:

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

到:

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

%c是由Printf 文档中相应的 Unicode 代码点表示的字符:http: //golang.org/pkg/fmt/

于 2013-10-07T18:09:11.507 回答