PowerShell设置空数组长度无效,填充猜中字母时出现数组索引越界错误的问题求助
咱一步步拆解你这个猜词脚本的问题,然后逐个修复:
核心问题分析
数组初始化错误
你用$arrayOutput=@()创建了空数组,PowerShell里这类常规数组是固定大小的——空数组根本没有索引0到$LengthSolution-1的元素,直接给$arrayOutput[$i]赋值肯定会报索引越界。而且你尝试修改.Length属性的方式完全不对:PowerShell数组的Length是只读属性,没法直接赋值改变长度。误用自动变量
$Input$Input是PowerShell的内置自动变量,专门用来接收管道输入,你把它当用户输入的变量用,会干扰它的原生功能,甚至导致循环逻辑混乱。必须换个自定义变量名。循环条件逻辑错误
你的循环条件while ($Input -notmatch $Solution)有两个致命问题:一是脚本启动时$Input没赋值,初始判断就会出错;二是用户每次输入的是单个字母,用-notmatch去匹配整个目标字符串完全不合逻辑,应该判断当前已猜中字符拼接成的字符串是否等于目标字符串。字符匹配的小漏洞
你拿字符串$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
相关产品推荐
相关产品推荐

