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

PowerShell设置空数组长度无效,填充猜中字母时出现数组索引越界错误的问题求助

咱一步步拆解你这个猜词脚本的问题,然后逐个修复:

核心问题分析

  1. 数组初始化错误
    你用$arrayOutput=@()创建了空数组,PowerShell里这类常规数组是固定大小的——空数组根本没有索引0到$LengthSolution-1的元素,直接给$arrayOutput[$i]赋值肯定会报索引越界。而且你尝试修改.Length属性的方式完全不对:PowerShell数组的Length是只读属性,没法直接赋值改变长度。

  2. 误用自动变量$Input
    $Input是PowerShell的内置自动变量,专门用来接收管道输入,你把它当用户输入的变量用,会干扰它的原生功能,甚至导致循环逻辑混乱。必须换个自定义变量名。

  3. 循环条件逻辑错误
    你的循环条件while ($Input -notmatch $Solution)有两个致命问题:一是脚本启动时$Input没赋值,初始判断就会出错;二是用户每次输入的是单个字母,用-notmatch去匹配整个目标字符串完全不合逻辑,应该判断当前已猜中字符拼接成的字符串是否等于目标字符串。

  4. 字符匹配的小漏洞
    你拿字符串$Input和字符$arraySolution[$i]比较,虽然PowerShell会自动转换类型,但如果用户输入多个字符,逻辑就会乱,更严谨的方式是只取用户输入的第一个字符来匹配。


修改后的完整脚本

$Solution = "Apfelpfannekuchen"
$arraySolution = $Solution.ToCharArray()
# 直接用字符串的Length属性,比measure-object高效得多
$LengthSolution = $Solution.Length
# 初始化一个和目标字符串长度相同的字符数组,用下划线做占位符
$arrayOutput = [char[]]::new($LengthSolution)
for ($i = 0; $i -lt $LengthSolution; $i++) {
    $arrayOutput[$i] = '_'
}

# 循环条件改为:已猜中字符拼接后不等于目标字符串时继续
while (-not ($arrayOutput -join '' -eq $Solution)) {
    # 用自定义变量名替代内置的$Input
    [string]$userInput = Read-Host "Choose a letter"
    # 只取第一个字符,避免用户输入多个字符的情况
    $guessChar = $userInput.ToCharArray()[0]

    # 遍历目标数组,匹配到就替换占位符
    for ($i = 0; $i -lt $LengthSolution; $i++) {
        if ($guessChar -eq $arraySolution[$i]) {
            $arrayOutput[$i] = $guessChar
        }
    }

    # 打印当前进度,用空格分隔更易读
    Write-Host ($arrayOutput -join ' ')
}

Write-Host "Congratulations! You guessed the word: $Solution"

关键修改说明

  • 正确初始化数组:用[char[]]::new($LengthSolution)创建指定长度的字符数组,每个索引位置都有初始值,解决了索引越界的问题;加下划线占位符还能让用户直观看到未猜中的位置。
  • 替换自动变量:用$userInput代替$Input,避免干扰PowerShell的内置功能。
  • 修复循环逻辑:通过$arrayOutput -join ''把数组拼接成字符串,再和目标字符串比较,判断是否猜完整个单词。
  • 健壮性优化:只取用户输入的第一个字符,不管用户输入多个字符还是单个,都能正常处理。

内容的提问来源于stack exchange,提问作者mathias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:53:11