C++ 如何将数字包装成一个范围?

C++ 如何将数字包装成一个范围?,c++,C++,我有一个程序,它接受字符串中的每个字符。向其添加一个数字x(x每次添加到字符时都会增加)。我需要新字符(c+x)在[32126]范围内 我知道使用%126来保持c+x32,并且这些数字在该范围内“环绕”吗 以下是我的代码: string a; unsigned int x = 1; cin >> a; for (auto &c : a) { if (c <= 126 && c >= 32)

我有一个程序,它接受字符串中的每个字符。向其添加一个数字x(x每次添加到字符时都会增加)。我需要新字符(c+x)在[32126]范围内

我知道使用%126来保持c+x32,并且这些数字在该范围内“环绕”吗

以下是我的代码:

    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;
    }
}

我意识到我已经试过了,但是用32而不是31,这意味着它将排除在32的包装中

由于
%
运算符允许您获取
[0;限制)
空间,因此当您需要
[start;limit)
空间时,标准方法是通过
%
运算符获取空间
[0;limit-start]
,然后将其添加到
开始
中。这样您将获得
[start;limit)
空格。因此公式为

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

或者,在您的情况下:


c=32+(c+x-32)%(126-32);

由于
%
运算符允许您获取
[0;限制)
空间,当您需要
[start;limit)
空间时,标准方法是获取空间
[0;limit-start]
通过
%
运算符,然后将其添加到
开始
。这样您将获得
[开始;限制)
空间。因此公式为

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

或者,在您的情况下:


c=32+(c+x-32)%(126-32);

您是否丢失了代码顶部的
int main()
(以及一些
#include
指令),或者这是一个更大的片段?(我不想编辑为“正确”)如果不止这些。您的编辑看起来好像没有使用正确的公式。因为数字应该在32到126之间(包括两个结束值),您需要进行模运算(126-32+1=95)。如图所示,您可以得到31(如果c+x是126的倍数),或者可以得到156(如果c+x%126是125)。两者都不符合您设定的标准。答案更准确。您是否丢失了代码顶部的
int main()
(以及一些
#include
指令),或者这是更大的部分?(我不想编辑为“更正”)如果不止这些。您的编辑看起来好像没有使用正确的公式。因为数字应该在32到126之间(包括两个结束值),您需要进行模运算(126-32+1=95)。如图所示,您可以得到31(如果c+x是126的倍数),或者可以得到156(如果c+x%126是125)。两者都不符合您设定的标准。答案更精确。由于某些原因,结果不正确。输入“abcdefghijklmnopqrstuvwxyz”应变为“bdfhjlnrprvxz | ~!#%)+-/1”@TimothyColemanHarrelson,是的,很抱歉,有一个错误:你还应该从
numberToBeWrapped
中减去
start
。我为你的案例修正了公式和代码。我明白了,开始时的数字必须是start-1,否则它会将起始数字排除在外。@TimothyColemanHarrelson,我很高兴,这一点您找到了一种方法使其工作:)注意:我刚刚注意到,您使用
%126
而不是
%127
%126
将为您提供范围
[0;125]
(不包括126)。出于某种原因,这并没有给我正确的结果。输入“abcdefghjjjklmnopqrstuvwxyz”应该变成“bdfhjlnrprtvxz~!”+/1”@TimothyColemanHarrelson,是的,很抱歉,有一个错误:你还应该从
numberToBeWrapped
中减去
start
。我为你的案例修正了公式和代码。我明白了,开始时的数字必须是start-1,否则它会将起始数字排除在外。@TimothyColemanHarrelson,我很高兴,这一点你找到了一种方法:)注意:我刚刚注意到,你使用
%126
而不是
%127
%126
将为你提供范围
[0;125]
(126不包括在内)。
c = 31 + (c + x) % (126);