我有一个程序,它接受字符串中的每个字符。为它添加一个数字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之外。
答案 0 :(得分:7)
由于%
运算符可让您获得[0; limit)
空格,因此当您需要[start; limit)
空格时,标准方法是通过{{1}获取空格[0; limit - start]
}运算符,然后将其添加到%
。这样您就可以获得start
空间。那么公式就是
[start; limit)
或者,在您的情况下:
numberToBeWrapped = start + (numberToBeWrapped - start) % (limit - start)