You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:30:52