You need to enable JavaScript to run this app. C#提取文本隐藏4位PIN码时代码运行结果与预期不符,寻求修复建议
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 13:15:04