这是“ASCII算术”的可接受用途吗?

时间:2010-03-23 20:15:30

标签: c++

我有一个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 个答案:

答案 0 :(得分:9)

从C ++标准,第2.2.3节:

  

在源和执行基本字符集中,每个字符的值在0之后   上面的十进制数字列表应大于前一个值。

所以,是的,如果你保证永远不需要随身携带,那么你很高兴。

答案 1 :(得分:5)

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

答案 2 :(得分:3)

请记住,如果这是由您无法完全控制的内容(例如用户和第三方系统)生成的,那么某些内容可能会出现问题。 (查看墨菲定律)

所以我认为在这样做之前至少应该进行一些验证。

答案 3 :(得分:1)

听起来像改变字符串就像你描述的那样比首先解析数字更容易。因此,如果您的算法有效(并且它确实按照您的描述进行),我认为它不会过早优化。

当然,添加400后,它不再是日期编号,因此您无法递归应用此过程。

而且,<强制性的2100年警告>

答案 4 :(得分:1)

很久以前我看到了一些x86处理器instructions for ASCII and BCD。 这些是AAA(增加的ASCII调整),AAS(减法),AAM(多),AAD(div)。
但即使您不确定目标平台,也可以参考您正在使用的字符集规范,我猜您会发现ASCII的前127个字符对于所有字符集始终具有相同的含义(对于首先是unicode)人物页面。)