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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:36:04