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

问题描述:

我有一个字符串值的形式10123X123456其中10是一年,123是一年中的天数,其余是独特的系统生成的东西。在某些情况下,我需要在天数上加上400,例如上面的数字就会变成10523X123456这是“ASCII算术”的可接受使用吗?

我的第一个想法是对这三个字符进行子串处理,将它们转换为整数,将400加到它,将它们转换回字符串,然后在原始字符串上调用replace。这样可行。

但随后发生,我认为我真正需要改变的唯一字符是第三个,而原来的值将永远是0-3,所以永远不会有任何“携带”的问题。我进一步想到,数字的ASCII码点是连续的,所以例如将数字4加到字符“0”将导致“4”,等等。这就是我最终做的。

我的问题是,有什么理由不会总是有效吗?我通常避免使用“ASCII算术”,理由是它不是跨平台或国际化友好的。但是,假设数字的码点始终是连续的,即“4”总是比“3”多1,这似乎是合理的。有人看到这个推理有什么问题吗?

这是代码。

string input = "10123X123456"; 
input[2] += 4; 
//Output should be 10523X123456 
+6

添加一个大胖评论,解释你的行为,你会好起来的我猜 – NomeN 2010-03-23 20:30:43

+2

我同意@NomeN,这需要一个评论。 “由于某种原因增加了400天,像'400'这样的用户我能说什么呢?这是一个很好的数字。” – 2010-03-23 20:37:17

+0

@Nomen和Jeffrey:我想过解释为什么,但决定与问题无关。无论如何,这不是我的决定,只是一个商业需求。 – 2010-03-23 20:59:42

从C++标准,2.2.3节:

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

所以是的,如果你保证不需要携带,那么你很好。

+0

它是C++ 0x中的2.3.3([lex.charset])。 – kennytm 2010-03-23 20:24:44

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

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

当然,你加400后,它不再是一个天数,所以你不能递归应用此过程。

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

始终牢记,如果这是你做的不完全的控制(如用户和第三方系统)的东西,这生成了一些可以和会错。 (看看墨菲定律)

所以我认为你应该至少把一些验证才这样做的。

+0

+1,好点。我在达到这一点之前验证了输入。 – 2010-03-23 21:00:44

很长一段时间前,我看到一些x86处理器instructions for ASCII and BCD。 这些是AAA(ASCII调整为加法),AAS(减法),AAM(多),AAD(格)。
但是,即使您不确定目标平台,您可以参考您正在使用的字符集规范,我想您会发现ASCII的前127个字符对于所有字符集都具有相同的含义(对于unicode是第一个字符页面)。