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

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()会一次性替换字符串内所有匹配的字符,无法实现不同位置的*替换为不同字符的效果
  • 缺失替换位置标记:没有维护索引变量记录当前*应该对应替换序列中的第几个字符,无法实现顺序匹配
正确实现方案

实现思路

  1. 优先做边界判断:如果原字符串不含*,或者替换字符序列为空,直接返回原字符串即可
  2. 使用StringBuilder构建结果字符串,比逐次拼接普通字符串效率更高
  3. 维护一个替换索引指针,初始值为0,用来标记当前应该取替换序列中的哪个字符
  4. 逐字符遍历原字符串:
    • 当前字符不是*时,直接追加到结果中
    • 当前字符是*时,取替换序列中指针位置的字符追加到结果,同时指针向后移动一位
  5. 遍历完成后将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:48:25