代码之家  ›  专栏  ›  技术社区  ›  John M Gant aman_novice

这是一个可以接受的使用“ASCII算法”?

c++
  •  4
  • John M Gant aman_novice  · 技术社区  · 14 年前

    我有一个字符串值的形式 10123X123456 10 是一年, 123 是一年中的天数,其余的是唯一的系统生成的东西。在某些情况下,我需要在日数的基础上加上400,这样上面的数字就会变成 10523X123456 .

    我的第一个想法是给这三个字符加上子串,把它们转换成整数,再加上400,再把它们转换成字符串,然后调用 replace 在原始字符串上。这很管用。

    但后来我突然想到,我真正需要更改的唯一字符是第三个字符,并且原始值始终是0-3,因此永远不会出现任何“携带”问题。我进一步想到,数字的ASCII码点是连续的,因此将数字4添加到字符“0”中会导致“4”,以此类推。所以我最后就是这么做的。

    我的问题是,有什么理由不总是有效的吗?我通常避免使用“ASCII算法”,因为它不适合跨平台或国际化。但似乎可以合理地假设数字的代码点总是连续的,即“4”总是比“3”多1个。有人觉得这个推理有问题吗?

    这是密码。

    string input = "10123X123456";
    input[2] += 4;
    //Output should be 10523X123456
    
    5 回复  |  直到 14 年前
        1
  •  9
  •   Michael Kristofik    14 年前

    从C++标准,2.2.3节:

    在源基本字符集和执行基本字符集中,源代码中0之后的每个字符的值 上述小数位数列表应比前一个数字的值大一位。

    所以是的,如果你保证永远不需要携带,你就可以走了。

        2
  •  5
  •   Jeffrey L Whitledge    14 年前

    C++语言定义要求数字的代码点值是连续的。因此,ASCII算法是完全可以接受的。

        3
  •  3
  •   David Brunelle    14 年前

    所以我觉得你至少应该先做些验证。

        4
  •  1
  •   Potatoswatter R. Martinho Fernandes    14 年前

    听起来像是改变你所描述的字符串要比一开始就把数字解析出来容易得多。因此,如果你的算法工作(而且它确实做了你所描述的),我不会认为它是过早的优化。

    当然,在您添加400之后,它不再是一个日数,因此您不能递归地应用此过程。

    而且, < 2100纳税年度警告 > .

        5
  •  1
  •   ony    14 年前

    instructions for ASCII and BCD .
    但即使您不确定目标平台,您也可以参考正在使用的字符集的规范,我猜您会发现ASCII的前127个字符对于所有字符集总是具有相同的含义(对于unicode,这是第一个字符页)。