在解密程序中使用带负数的模数的问题

我对C很陌生,最近一直致力于制作一个简单的加密/解密程序。 我设法使加密很好,但我已经解密了。

相关代码如下:

加密(其中asciinum是字母的ascii值,k是要移位的“vigenere”键)。

//shifts lowercase letters by key if (asciinum >= 97 && asciinum = 65 && asciinum <= 91) { f = p % keylen; k = key[f]; asciinum = (asciinum - 65) + k; asciinum = (asciinum % 26) + 65; letterc = (char) asciinum; cipher[j] = letterc; p++; } 

我想使用类似的模型来解密(使用相同的密钥),但是当asciinum为负时,我用来包裹26个字符的模数方法不起作用,就像从a中减去ak为5的情况一样(即0)。

解密尝试……

  //shifts uppercase letters by key if (asciinum >= 65 && asciinum <= 91) { f = p % keylen; k = key[f]; asciinum = (asciinum - 65) - k; asciinum = (asciinum % 26) + 65; letterc = (char) asciinum; cipher[j] = letterc; p++; } 

任何帮助将不胜感激。 谢谢!

在C99 C之前,负数的%行为是实现定义的。 在C99开始,它是定义的,但不能做你想要的。

最简单的方法是:

 ((asciinum + 26) % 26) 

假设asciinum永远不会低于-26。

使用(asciinum + 26) % 26 ,而不是使用asciinum % 26 ,这将使您在正数上使用模数,代价是每次循环时额外添加。