如何将数字包装到一个范围内?

时间:2015-02-04 04:33:26

标签: c++

我有一个程序,它接受字符串中的每个字符。为它添加一个数字x(每次添加到char时x都会增加)。我需要新的字符(c + x)与范围[32,126]。

我知道使用%126来保持c + x <126,但我如何确保c + x也> 32并且数字是“包裹”在该范围内?

这是我的代码:

    string a;
    unsigned int x = 1;

    cin >> a;

    for (auto &c : a)
    {
        if (c <= 126 && c >= 32)
        {
            if (c + x > 126) //checking if c needs to be wrapped
            {
                c = (c + x) % (126); //wrapping c? <-- this is the problem
            }
            else
            {
                c += x;
            }

            if (x == 256)
            {
                x = 1;
            }
            else
            {
                x++;
            }
        }
        cout << c;
    }
}

编辑:我认为包装它应该是:

c = 31 + (c + x) % (126);

我意识到我已经尝试了这个但是用32而不是31,这意味着它会将它排除在32之外。

1 个答案:

答案 0 :(得分:7)

由于%运算符可让您获得[0; limit)空格,因此当您需要[start; limit)空格时,标准方法是通过{{1}获取空格[0; limit - start] }运算符,然后将其添加到%。这样您就可以获得start空间。那么公式就是

[start; limit)

或者,在您的情况下:

numberToBeWrapped = start + (numberToBeWrapped - start) % (limit - start)