【问题标题】:How to modify a specific character in a string如何修改字符串中的特定字符
【发布时间】:2020-01-20 00:22:03
【问题描述】:

在 C 语言中,我们将字符串的字符定义为 Char。所以我想在 Go 中改变一个字符串的字符。

if sum%11 != int(str[strlen-1]) {
    str[strlen-1] = byte(sum % 11)
    //fmt.Printf("%T %T\n", str[strlen-1], byte(sum%11))
} else {
    fmt.Println(sum)
}

但是会报错“cannot assign to str[strlen - 1]”。 str[strlen-1] 和 byte(sum%11) 都是 uint8。为什么是错的?我应该如何转换?

【问题讨论】:

  • 字符串是不可变的,但切片不是。如果您正在处理二进制数据,请先将字符串转换为[]byte[]uint8。如果您正在处理 UTF-8 编码的文本,请转换为 []rune(rune 是 uint32 的别名)。如果您要处理任何其他文本编码,则只能自己处理。

标签: go


【解决方案1】:

与 C 不同,Go 字符串是不可变的,因此您不能修改字符串中的单个字节。但是,您可以将字符串转换为字节数组,对其进行更改,然后将该字节数组转换为字符串。

arr:=[]byte(str)
arr[strlen-1]=byte(sum%11)
str=string(arr)

请注意,Go 字符串是 UTF-8 编码的。一个符文可以表示为多个字节。通过像这样修改字符串,您可能会得到一个无效的字符串。

【讨论】:

  • 是的,但仍然是字节数组。
  • UTF-8 是一种可变长度编码,每个字符一到四个字节。字节不是字符。
  • 如果底层字符串使用1字节符文,那么你可以把字符串当作一个字节数组,不是吗?
  • 是的,迂腐的解决方案是通过最后一个rune(1-4 字节)并将符文替换为 1 字节。但是由于 OP 引用了 C 并且很可能是一个 ASCII 字符串,所以这个解决方案可能很好。
  • 一个 8 位 Unicode 代码点被 UTF-8 编码为一个或两个字节。
猜你喜欢
  • 2014-11-27
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 2015-07-25
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多