C#中按字符串指定位置取ASCII字符并偏移的实现问题
解决C#中字符ASCII偏移并拼接新字符串的问题
我来帮你看看这段代码里的问题,你想要实现的其实是类似凯撒密码的字符偏移功能——把字符串每个字符的ASCII值加上指定偏移量,再拼接成新字符串对吧?先拆解下现有代码里的几个关键错误:
- 循环条件错误:你的
for循环写的是i == Str.Length - 1,这意味着循环只会在i等于字符串最后一个索引时执行一次,完全遍历不了整个字符串,应该改成i < Str.Length才能逐个处理每个字符。 - 字符处理冗余且易出错:你用
Encoding.ASCII.GetBytes(Str[index: i])来获取字符的字节,其实直接取Str[i]就能拿到对应的char,而且char本身可以直接参与整数运算(会自动转成对应的ASCII值)。 - 字符串拼接逻辑错误:每次循环你直接把结果赋值给
StrEnd,这会覆盖之前的内容,最后只会保留最后一个字符的处理结果,应该用+=来追加,或者用StringBuilder来提升性能(字符串是不可变类型,频繁+=会产生额外开销)。 - 类型转换遗漏括号:你写的
(char)Encoding.ASCII.GetBytes(Str[index: i]) + Clave,这里的强制转换只作用于字节数组的结果,应该把字符值+偏移量整体用括号包起来再转成char。
修正后的完整代码
// 获取输入内容 string Str = txtStr.Text; int Clave = Convert.ToInt32(txtCv.Text); string StrEnd = string.Empty; // 遍历字符串每个字符 for (int i = 0; i < Str.Length; i++) { // 计算偏移后的字符:原字符ASCII值 + 偏移量,再转成char char shiftedChar = (char)(Str[i] + Clave); // 追加到结果字符串 StrEnd += shiftedChar; } // 如果追求更高性能,推荐用StringBuilder: // StringBuilder sb = new StringBuilder(); // foreach (char c in Str) // { // sb.Append((char)(c + Clave)); // } // string StrEnd = sb.ToString();
测试示例验证
- 当
Str = "ABC",Clave = 1时:A(65)+1=66→B,B(66)+1=67→C,C(67)+1=68→D,最终StrEnd为BCD,符合你的期望。 - 当
Str = "Hola",Clave = 2时:H(72)+2=74→J,o(111)+2=113→q,l(108)+2=110→n,a(97)+2=99→c,最终StrEnd为Jqnc,完全匹配需求。
内容的提问来源于stack exchange,提问作者Facundo Labonia




