C#按顺序替换字符串中*为指定字符 代码输出异常求解
问题背景
需求为在C#中按顺序将字符串内的*占位符替换为指定字符序列的对应字符,规则如下:
- 示例1:原字符串
p**gra*,替换字符序列rom,替换后输出program - 示例2:原字符串
"*h*s *s v*ry *tr*ng*",替换字符序列"Tiiesae",替换后输出"This is very strange"
原有实现代码运行后无法得到正确结果,需要排查问题并给出正确实现。
原代码如下:
namespace Uncensor { class Program { // "*h*s *s v*ry *tr*ng*", "Tiiesae" ➜ "This is very strange" static string uncensor(string str,string s) { string s1 = ""; int i, j; if (str.Contains("*")) { for (i = 0; i < str.Length; i++) { if (str[i] == '*') { for (j = 0; j < s.Length; j++) { s1 = str.Replace(str[i], s[j]); } } } return s1; } else { return str; } } static void Main(string[] args) { Console.WriteLine("Enter string:"); string str = Console.ReadLine(); Console.WriteLine("Enter string to be replaced by * :"); string s = Console.ReadLine(); string original_text= uncensor(str, s); Console.WriteLine(original_text); Console.Read(); } } }
原有代码问题排查
原实现存在3个核心错误,导致无法输出正确结果:
- 嵌套循环逻辑完全错误:每遇到一个
*就遍历整个替换字符序列,且每次都基于原始输入字符串调用替换方法,最终返回的结果只会保留最后一次替换的状态,和逐位顺序替换的需求完全不符 - 误用
Replace方法:string.Replace()会一次性替换字符串内所有匹配的字符,无法实现不同位置的*替换为不同字符的效果 - 缺失替换位置标记:没有维护索引变量记录当前
*应该对应替换序列中的第几个字符,无法实现顺序匹配
正确实现方案
实现思路
- 优先做边界判断:如果原字符串不含
*,或者替换字符序列为空,直接返回原字符串即可 - 使用
StringBuilder构建结果字符串,比逐次拼接普通字符串效率更高 - 维护一个替换索引指针,初始值为0,用来标记当前应该取替换序列中的哪个字符
- 逐字符遍历原字符串:
- 当前字符不是
*时,直接追加到结果中 - 当前字符是
*时,取替换序列中指针位置的字符追加到结果,同时指针向后移动一位
- 当前字符不是
- 遍历完成后将
StringBuilder转为普通字符串返回即可
完整修正代码
using System; using System.Text; namespace Uncensor { class Program { // "*h*s *s v*ry *tr*ng*", "Tiiesae" ➜ "This is very strange" static string uncensor(string str, string replaceChars) { if (!str.Contains('*') || string.IsNullOrEmpty(replaceChars)) { return str; } StringBuilder result = new StringBuilder(); int replaceIndex = 0; foreach (char c in str) { if (c == '*') { result.Append(replaceChars[replaceIndex]); replaceIndex++; } else { result.Append(c); } } return result.ToString(); } static void Main(string[] args) { Console.WriteLine("Enter string:"); string str = Console.ReadLine(); Console.WriteLine("Enter string to be replaced by * :"); string s = Console.ReadLine(); string original_text = uncensor(str, s); Console.WriteLine(original_text); Console.Read(); } } }
实现说明
- 整体时间复杂度为O(n),n为原字符串长度,仅需遍历一次原串即可完成替换,效率远高于原嵌套循环实现
- 逐字符构建结果的方式,完全避免了
Replace方法批量替换所有匹配项的问题 - 替换索引指针和
*的出现顺序严格对应,保证每个占位符都能按顺序拿到替换序列中对应的字符,符合需求
内容的提问来源于stack exchange,提问作者Pari Sharma
相关产品推荐
相关产品推荐

