大学学习Golang遇到问题求助
大学学习Golang遇到问题求助 我正在学习Go语言,正在做这个练习:定义:字符串的压缩编码由一系列值对ch n定义,其中ch代表一个字符,而n>0是该ch字符重复的次数。
示例:字符串eeeaaaa对应值序列e 3 a 4,即字符’e’重复3次,后跟字符’a’重复4次。
编写一个程序,从命令行读取字符串的压缩编码,并在屏幕上打印解压后的字符串。
假设输入中给出的每个字符都属于英文字母表,因此使用US-ASCII标准(集成在Unicode标准中)编码。
同时假设命令行上指定的值序列格式正确,并且至少包含一个ch n对。
但是当我使用值a3 b1运行程序时,结果是:aaaabababababababababababababababababababababababababababababababababababababababababababababababababab
package main
import (
"fmt"
"unicode"
"os"
"strings"
)
func main (){
c := os.Args[1:]
char := ""
var n, j int
for _, cazz := range c {
r := []rune(cazz)
for _, dio := range r{
if unicode.IsLetter(dio){
char += string(dio)
} else if unicode.IsNumber(dio){
n += int(dio)
j = n - 48
anubi := strings.Repeat(char, j)
fmt.Print(anubi)
}
/*anubi := strings.Repeat(char, j)
fmt.Print(anubi)*/
}
}
}
我认为问题出在else if unicode.IsNumber内部需要一个for循环。
更多关于大学学习Golang遇到问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你在打印序列后没有清除变量“char”和“n”, 在
fmt.Print(anubi)
char = ""
n = 0
更多关于大学学习Golang遇到问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码问题在于对数字的处理逻辑不正确。当遇到数字字符时,你直接将ASCII值累加到变量n中,这会导致重复次数计算错误。以下是修正后的代码:
package main
import (
"fmt"
"os"
"unicode"
)
func main() {
args := os.Args[1:]
var result string
var currentChar string
var count int
for _, arg := range args {
runes := []rune(arg)
for i := 0; i < len(runes); i++ {
if unicode.IsLetter(runes[i]) {
// 如果之前有字符和计数,先处理
if currentChar != "" && count > 0 {
result += repeatChar(currentChar, count)
}
// 重置当前字符和计数
currentChar = string(runes[i])
count = 0
} else if unicode.IsNumber(runes[i]) {
// 构建数字(处理多位数)
count = count*10 + int(runes[i]-'0')
}
}
}
// 处理最后一个字符序列
if currentChar != "" && count > 0 {
result += repeatChar(currentChar, count)
}
fmt.Print(result)
}
func repeatChar(char string, count int) string {
var result string
for i := 0; i < count; i++ {
result += char
}
return result
}
或者更简洁的版本:
package main
import (
"fmt"
"os"
"strconv"
"unicode"
)
func main() {
args := os.Args[1:]
var output string
var char string
var numStr string
for _, arg := range args {
for _, r := range arg {
if unicode.IsLetter(r) {
// 如果之前有字符和数字,先处理
if char != "" && numStr != "" {
n, _ := strconv.Atoi(numStr)
output += strings.Repeat(char, n)
numStr = ""
}
char = string(r)
} else if unicode.IsNumber(r) {
numStr += string(r)
}
}
}
// 处理最后一对
if char != "" && numStr != "" {
n, _ := strconv.Atoi(numStr)
output += strings.Repeat(char, n)
}
fmt.Print(output)
}
关键修正点:
- 正确处理多位数(如"a12"中的12)
- 在遇到新字符时处理前一个字符的重复
- 使用
int(runes[i]-'0')正确转换数字字符 - 添加了
repeatChar辅助函数提高可读性
使用输入a3 b1时,现在会正确输出"aaab"。

