'De-Vigenere' 程序中带模运算符的负数
Negative numbers with modulo operator in 'De-Vigenere' program
我正在制作一个解密 vigenere 密码的程序。用户只能给出字母键。
for (int i = 0, counter = strlen(text); i < counter; i++)
{
// prints non-alphabetical characters straight away
if (!isalpha(text[i]))
{
printf("%c", text[i]);
}
else
{
// for index of key
index = meta % strlen(key);
if (islower(text[i]))
{
// separate cases depending upon case of key
if (islower(key[index]))
{
printf("%c", (((text[i] - 97) - (key[index] - 97)) % 26) + 97);
}
else
{
printf("%c", (((text[i] - 97) - (key[index] - 65)) % 26) + 97);
}
}
else
{
if (islower(key[index]))
{
printf("%d", (((text[i] - 65) - (key[index] - 97)) % 26) + 65);
}
else
{
printf("%c", (((text[i] - 65) - (key[index] - 65)) % 26) + 65);
}
}
// incrementing for next key alphabet
meta++;
}
维杰内尔:
输入:我的名字
按键:qwerty
- 输出:CuRrfc
德·维杰内尔:
- 输入:CuRrfc
- 按键:qwerty
- 预期输出:我的名字
- 给出的输出:3_NaSK
我该如何解决?
问题在于模运算符处理负数的方式。
对于某些字符,您会得到负值,然后模运算 returns 会得到一个负值。您需要 [0, 25].
范围内的值
你可以通过在取模前加26来修正它。
printf("%c", (((text[i] - 97) - (key[index] - 97)) % 26) + 97);
会变成
printf("%c", (((text[i] - 97) - (key[index] - 97) + 26) % 26) + 97);
以同样的方式更改所有四行。
我正在制作一个解密 vigenere 密码的程序。用户只能给出字母键。
for (int i = 0, counter = strlen(text); i < counter; i++)
{
// prints non-alphabetical characters straight away
if (!isalpha(text[i]))
{
printf("%c", text[i]);
}
else
{
// for index of key
index = meta % strlen(key);
if (islower(text[i]))
{
// separate cases depending upon case of key
if (islower(key[index]))
{
printf("%c", (((text[i] - 97) - (key[index] - 97)) % 26) + 97);
}
else
{
printf("%c", (((text[i] - 97) - (key[index] - 65)) % 26) + 97);
}
}
else
{
if (islower(key[index]))
{
printf("%d", (((text[i] - 65) - (key[index] - 97)) % 26) + 65);
}
else
{
printf("%c", (((text[i] - 65) - (key[index] - 65)) % 26) + 65);
}
}
// incrementing for next key alphabet
meta++;
}
维杰内尔:
输入:我的名字
按键:qwerty
- 输出:CuRrfc
德·维杰内尔:
- 输入:CuRrfc
- 按键:qwerty
- 预期输出:我的名字
- 给出的输出:3_NaSK
我该如何解决?
问题在于模运算符处理负数的方式。
对于某些字符,您会得到负值,然后模运算 returns 会得到一个负值。您需要 [0, 25].
范围内的值你可以通过在取模前加26来修正它。
printf("%c", (((text[i] - 97) - (key[index] - 97)) % 26) + 97);
会变成
printf("%c", (((text[i] - 97) - (key[index] - 97) + 26) % 26) + 97);
以同样的方式更改所有四行。