C#字符串替换为等长下划线问题及Hangman游戏实现优化咨询
问题分析与优化方案
原代码无效的原因
你最初的代码有两个关键问题:
sb.Replace(str, "_", 0, str.Length)的逻辑是查找整个字符串"hello"并替换为单个下划线,而非把每个字符逐一替换成下划线。- 最后输出的是原字符串
str,而非修改后的StringBuilder内容(需要调用sb.ToString()才能获取修改后的结果)。
修正后的初始代码可以这样写:
using System; using System.Text; namespace randomtesting { internal class Program { static void Main(string[] args) { string str = "hello"; StringBuilder sb = new StringBuilder(str); // 遍历每个字符替换为下划线 for (int i = 0; i < sb.Length; i++) { sb[i] = '_'; } // 输出修改后的内容 Console.WriteLine(sb.ToString()); } } }
你的实现的优化点
你后续的实现思路没问题,但有两处可以优化的地方:
str.IndexOf(guess)只会返回第一个匹配字符的索引,如果原字符串有重复字符(比如"hello"里的两个'l'),会遗漏其他匹配项。- 可以提前初始化StringBuilder并复用,减少不必要的内存分配。
高效优化版本
using System; using System.Text; namespace randomtesting { internal class Program { static void Main(string[] args) { string originalWord = "hello"; // 直接生成下划线字符串并转为StringBuilder,后续复用 StringBuilder displayWord = new StringBuilder(new string('_', originalWord.Length)); Console.WriteLine(displayWord.ToString()); // 简化字符读取,避免空输入异常(可额外加输入长度校验) char guess = char.ToLower(Console.ReadLine()[0]); // 遍历所有匹配的字符索引,替换所有对应下划线 int index = originalWord.IndexOf(guess); while (index != -1) { displayWord[index] = guess; index = originalWord.IndexOf(guess, index + 1); } Console.WriteLine(displayWord.ToString()); } } }
优化说明
- 用
char.ToLower(Console.ReadLine()[0])替代Convert.ToChar(Console.ReadLine().ToLower()),减少冗余类型转换,同时避免用户输入空字符串时的异常。 - 通过循环调用带起始位置参数的
IndexOf,找到所有匹配的字符索引,一次性替换所有对应下划线,解决重复字符的替换问题。 - 复用同一个StringBuilder实例,减少内存分配开销。
内容的提问来源于stack exchange,提问作者valkyr
相关产品推荐
相关产品推荐

