C#猜词游戏使用Substring与Length方法时如何避免ArgumentOutOfRangeException
问题根因
你遇到的System.ArgumentOutOfRangeException异常及其他逻辑错误由以下几个问题导致:
- Substring参数计算错误:报错行
temp = temp.Substring(0, i) + lalagyan + temp.Substring(i + 1, temp.Length - i + 1);中,Substring的第二个参数为待截取的字符长度,从下标i+1开始截取时,剩余最大长度为temp.Length - (i+1),你写的temp.Length - i +1会导致截取长度超过字符串实际剩余长度,触发参数越界异常。这里可以省略第二个参数,直接写temp.Substring(i+1)就能自动截取从起始位置到字符串末尾的所有内容,降低出错概率。 - temp初始化逻辑错误:你定义temp时初始值为带空格的
" ",首次循环bol=false时会拼接和单词长度一致的字符,最终temp的长度比目标单词长度多1,后续按单词下标操作temp时天然存在越界风险,temp初始值应该设为空字符串""。 - 最终答案判断逻辑错误:代码最后将用户输入的答案转大写后和
index(随机数组下标,整数类型)做相等判断,逻辑完全不成立,应该和word.ToUpper()比较才能判断用户猜的是否正确。 - 冗余无效代码:
lalagyan = Convert.ToString(word[i]).Replace("-", answer);这行完全没有作用,你已经匹配到word[i]等于用户输入的answer,直接用answer替换对应位置即可,不需要做多余的替换操作。
修复后的可运行代码
using System; using System.Collections; namespace ConsoleApp3 { class Program { static void Main(string[] args) { String temp = "", answer = ""; int count = 0, num = 5; var random = new Random(); ArrayList list = new ArrayList { "one", "two", "three", "four" }; int index = random.Next(list.Count); String word = list[index].ToString(); // 初始化输出下划线和temp变量 for (int i = 0; i < word.Length; i++) { Console.Write("-"); temp += "-"; } do { count++; Console.WriteLine("\nEnter a letter "); Console.WriteLine("Remaining Chances: " + num); Console.WriteLine("Clue: the word is " + word.Length + " letters"); Console.Write("Answer: "); answer = Console.ReadLine().Trim(); num--; Console.WriteLine(""); if (answer.Length == 1) // 仅处理单个字母输入的合法情况 { for (int i = 0; i < word.Length; i++) { if (answer.Equals(Convert.ToString(word[i]), StringComparison.OrdinalIgnoreCase)) { Console.Write("Correct Letter\n"); // 替换对应位置的字符 temp = temp.Substring(0, i) + answer + temp.Substring(i + 1); } } } Console.Write(temp); // 提前判断是否已经猜全所有字母,可提前结束 if (temp.Equals(word, StringComparison.OrdinalIgnoreCase)) { Console.WriteLine("\nYou already guessed all letters!"); break; } } while (count < 5); Console.Write("\nEnter Your Final Guess: "); answer = Console.ReadLine().Trim().ToUpper(); if (answer.Equals(word.ToUpper())) { Console.WriteLine("\nYour Guess Is Correct!"); } else { Console.WriteLine($"\nYour Guess Is Wrong! The correct word is {word}"); } } } }
可选优化点
- 猜中正确字母时不扣除剩余次数
- 限制用户只能输入单个字母,输入不符合规则时提示重输不消耗次数
- 增加重复输入相同正确字母的判断,避免重复提示
内容的提问来源于stack exchange,提问作者wloleo
相关产品推荐
相关产品推荐

