C#提取文本隐藏4位PIN码时代码运行结果与预期不符,寻求修复建议
异常输出的核心原因
这是C#开发中非常常见的char类型运算歧义问题:C# 中 char 类型做加法运算时,会被隐式提升为 int 类型,计算的是两个字符的 ASCII 编码值之和,而非按顺序拼接字符。
- 测试用例中按代码逻辑取到的四个字符分别是
'1'(ASCII 49)、'3'(ASCII 51)、'5'(ASCII 53)、'7'(ASCII 55) - 第一组字符相加得到 49+51=100,第二组得到 53+55=108,两个数值转成字符串后和初始为空的
pin变量拼接,最终就得到了100108的异常输出,和实际现象完全匹配。
另外代码里的变量名startPostion存在拼写错误(正确拼写为startPosition),虽然不影响运行,但会降低代码可读性。
修复方案
要避免字符被隐式转成整数做加法,需要显式将取到的字符转为字符串后再拼接,最简洁的实现方式是用字符串插值直接生成最终PIN,完全规避+运算的类型歧义:
static void Main(string[] args) { string encodedPinNumber = Console.ReadLine(); string startPostionString = Console.ReadLine(); int step = Convert.ToInt32(Console.ReadLine()); int startPostion = startPostionString[0] - 'a'; // 直接通过插值拼接四个目标位置的字符 string pin = $"{encodedPinNumber[startPostion]}{encodedPinNumber[startPostion + step]}{encodedPinNumber[startPostion + 2 * step]}{encodedPinNumber[startPostion + 3 * step]}"; Console.WriteLine(pin); Console.Read(); }
如果保留原有的分步拼接逻辑,也需要给每个取到的字符加上 .ToString() 方法,强制转为字符串后再拼接:
string pin = ""; int startPostion = startPostionString[0] - 'a'; pin += encodedPinNumber[startPostion].ToString(); pin += encodedPinNumber[startPostion + step].ToString(); pin += encodedPinNumber[startPostion + 2 * step].ToString(); pin += encodedPinNumber[startPostion + 3 * step].ToString();
修复后用提供的测试用例(输入123456789、a、步长2),会依次取索引0、2、4、6位置的字符,最终输出1357,符合预期。
额外优化建议
- 增加索引越界校验,避免输入的步长、起始位置和字符串长度不匹配时抛出
IndexOutOfRangeException - 修正变量名的拼写错误,统一改为
startPosition提升代码可读性
内容的提问来源于stack exchange,提问作者Bodor Arianna
相关产品推荐
相关产品推荐

