增加字符串中的单个字符

时间:2011-05-20 12:12:32

标签: c++ string

我不知道我是否有正确的倾斜,所以如果我错了请纠正我,我会改变我的头衔。

我有一个字符串,对于这个例子,我将使用:

"8ce4b16b"

我想将位(我认为)沿1移位,因此字符串将是:

"9df5c27c"

任何想法?

编辑:

您知道,这些字符串是十六进制的。所以它永远不会到达z。 我想做的就是在数字上加一个数字,然后在字母表中一步一步,这样a-> b,f-> g ect ect

如果数字为9,则会有条件将其保持为9。

输出不需要是十六进制。

此外,字符串只是一个例子。它是MD5加密的一部分。

4 个答案:

答案 0 :(得分:6)

转换string?这听起来像是std::transform()的工作:

#include <cassert>
#include <string>

char increment(char c)
{
    if ('9' == c)
    {
        return '9';
    }
    return ++c;
}

std::string increment_string(const std::string& in)
{
    std::string out;
    std::transform(in.begin(), in.end(), std::back_inserter(out), increment);
    return out;
}

int main()
{
    assert(increment_string("8ce4b16b") == "9df5c27c");
    assert(increment_string("ffffffff") == "gggggggg");
    assert(increment_string("89898989") == "99999999"); // N.B: this is one of 2^8 strings that will return "99999999"
    assert(increment_string("99999999") == "99999999"); // This is one more. Mapping backwards is going to be tricky!
    return 1;
}

您希望对字符施加的任何限制都可以在increment()函数中实现,如图所示。

另一方面,如果您希望将字符串视为十六进制数字并将0x11111111添加到其中:

#include <sstream>
#include <cassert>

int main()
{
    std::istringstream iss("8ce4b16b");
    long int i;
    iss >> std::hex >> i;
    i += 0x11111111;
    std::ostringstream oss;
    oss << std::hex << i;
    assert(oss.str() == "9df5c27c");
    return 1;
}

string的构造中没有移位。

答案 1 :(得分:2)

看起来你只是将0x11111111添加到整数。但是你能准确指出你的输入有什么?当你将一个添加到“f”或“9”时,结果应该是什么?

答案 2 :(得分:1)

这不是移位位...移位一位将字值乘以2.您只需将每个十六进制值递增1,这可以通过将0x11111111添加到您的双字来完成。

例如,如果你取了你的值0x8ce4b16b(将上面打印的值视为 - 如果它们是十六进制的4字节双字),将它移动一位,你会最终得到0x19C962D6

但是如果你只是想增加你的dword的每个半字节(十六进制数中的每个单独的值代表4位或半字节),你将不得不为每个半字节添加一个0x1的偏移量。此外,十六进制字中没有G的值...您的值为0->9,然后是A->F,其中F表示基数为10的值15最后,当您将0x1添加到0xF时,您将回到0x0

答案 3 :(得分:0)

你的意思是你想增加字符串中的每个字符吗? 您可以通过数组迭代并为每个字符添加一个。