Go语言访问字符串切片元素返回空字符串问题求助
问题分析与解决
你的代码核心问题出在切片的初始化和赋值逻辑,同时输入读取也存在潜在问题,以下是具体说明和修正方案:
1. 切片操作错误
你用make([]string, num_strings)创建了一个长度为num_strings的切片,此时切片里的每个元素都是空字符串。之后又调用strings = append(strings, temp)把输入的字符串追加到切片末尾,导致切片结构变成:[空字符串, 空字符串, 输入字符串1, 输入字符串2, ...]。后续循环访问strings[i](i从0到num_strings-1)时,取的都是前几个空元素,自然输出为空。
修正方案
两种可选方式:
- 方式一:直接利用切片长度赋值
既然已经创建了长度为num_strings的切片,直接给对应索引位置赋值即可,无需append:strings := make([]string, num_strings) for i := 0; i < num_strings; i++ { var temp string fmt.Scanln(&temp) strings[i] = temp } - 方式二:初始化空切片再追加
放弃创建固定长度的切片,直接初始化空切片,通过append添加元素:var strings []string for i := 0; i < num_strings; i++ { var temp string fmt.Scanln(&temp) strings = append(strings, temp) }
2. 输入读取的潜在问题
fmt.Scan(&temp)会以空白符(空格、换行、制表符等)作为分隔符读取内容,如果输入的字符串包含空格,会被截断。题目要求每行一个独立字符串,改用fmt.Scanln(&temp)或bufio.Scanner能更准确读取整行内容。
另外,用fmt.Scan读取数字后,输入缓冲区会遗留换行符,第一次调用Scanln可能会读取到空字符串,需要额外处理,或者直接用bufio.Scanner来统一读取所有输入,更可靠。
完整修正代码
以下是优化后的完整代码,采用bufio.Scanner读取输入,避免换行问题,同时优化字符串拼接效率:
package main import ( "bufio" "fmt" "os" "strconv" ) func main() { scanner := bufio.NewScanner(os.Stdin) // 读取第一行的字符串数量N scanner.Scan() numStrings, _ := strconv.Atoi(scanner.Text()) // 读取N个字符串 strList := make([]string, numStrings) for i := 0; i < numStrings; i++ { scanner.Scan() strList[i] = scanner.Text() } // 处理每个字符串,分离偶索引和奇索引字符 for _, s := range strList { evenChars := make([]rune, 0, len(s)/2+1) oddChars := make([]rune, 0, len(s)/2) for idx, char := range s { if idx%2 == 0 { evenChars = append(evenChars, char) } else { oddChars = append(oddChars, char) } } fmt.Printf("%s %s\n", string(evenChars), string(oddChars)) } }
代码说明
- 使用
bufio.Scanner读取每行内容,避免了fmt.Scan系列函数的空白符分隔问题,确保准确读取每行输入。 - 用
rune切片拼接字符,比直接字符串拼接效率更高(字符串是不可变类型,每次拼接都会生成新字符串,而切片append操作更高效)。 - 直接给切片索引赋值,避免了原代码中切片元素偏移的问题。
内容的提问来源于stack exchange,提问作者John Harrington
相关产品推荐
相关产品推荐

