【问题标题】:Vigenere cipher runs into infinite loopVigenere 密码陷入无限循环
【发布时间】:2015-09-18 21:55:16
【问题描述】:

我最初有一个凯撒的密码,看起来像这样:

#include <stdio.h>
#include <string.h>

int main (int argc, char const *argv[])
{
        printf("Insira a frase:\n");
        char frase [256];
        //strcpy(frase, argv[1]);
        scanf("%s", frase);
        int size = (int)strlen(frase);
        printf("Insira o tamanho da divergência: \n");
        int diff = 0;
        scanf("%i", &diff);
        char fraseout [size+1];
        int i = 0;
        for (i = 0; i<=size-1; i++)
        {
                int val = (int)frase[i];
                if (val + diff > 126)
                {
                        while (val + diff >126)
                        {
                                val = 31+diff-(126-val);
                        }
                }
                else if (val + diff < 32)
                {
                        while (val + diff < 32)
                        {
                                val = 127 + diff+(val-32);
                        }
                }
                else
                {
                        val +=diff;
                }
                fraseout [i] = (char)val;
        }
        fraseout[size] = '\0';
        printf("\"%s\" -> \"%s\"\n", frase, fraseout);
        return 0;
}

然后我决定将其转换为 Vinegere 的密码,其中每个字符的编码编号由密码给出,并在单词的长度上进行迭代。所以,如果我的词是“abcde”而我的密码是“zx”,那么 (char, diff) 对将是 (a,z)(b,x)(c,z)(d,x)... 代码如下所示:

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[]) {
        /* code */
        char senha [256];
        if (argv[1] != NULL)
        {
                strcpy(senha, argv[1]);
        }
        char frase [256];
        printf("Insira a frase: \n");
        scanf("%s", frase);
        int sizeS = (int)strlen(senha);
        int sizeF = (int)strlen(frase);
        char fraseout [sizeF+1];
        int i;
        int j;
        for (i=0; i<=sizeF-1; i++)
        {
                if(j>sizeS)
                {
                        j=0;
                }
                int valF = (int)frase[i];
                int valS = (int)senha[i];
                printf(" F = %c = %i \n S = %c = %i\n", frase[i], valF, senha[i], valS);
                if (valF+valS > 126)
                {
                        while (valF+valS >126)
                        {
                                printf("ValF = %i\n", valF);
                                printf("ValS = %i\n", valS);
                                valF = 31 + valS-(valF-126);
                                printf("NewV = %i\n", valF);
                        }
                }
                else if (valF+valS < 32)
                {
                        while (valF+valS<32)
                        {
                                valF = 127 + valS+(valF-32);
                        }
                }
                else
                {
                        valF += valS;
                }
                printf("OUT = %i = %c\n",valF, (char)valF);
                printf("_________________________________\n");
                fraseout[i] = (char)valF;
                j++;
        }
        fraseout[sizeF] = '\0';
        printf("\"%s\" -> \"%s\"\n", frase, fraseout);
        return 0;
}

由于某种原因,这段代码只是在第一个 while() 语句中进入无限循环,我不明白为什么。我该如何解决这个问题?

【问题讨论】:

  • 您似乎在受影响的循环中插入了一些 printf() 语句。他们打印什么?
  • NewV = 176 ValF = 176 ValS = 116 NewV = 97 ValF = 97 ValS = 116 NewV = 176 ValF = 176 ValS = 116 NewV = 97 ValF = 97 ValS = 116 NewV = 176 ValF = 176 ValS = 116 NewV = 97 ValF = 97 ValS = 116 一直如此,一直如此。
  • 你永远不会使用j 做任何事情。不应该是senha[j] 而不是senha[i]
  • 刚刚试过,没有结果,仍然“NewV = 176 ValF = 176 ValS = 116 NewV = 97 ValF = 97 ValS = 116 NewV = 176 ValF = 176 ValS = 116 NewV = 97 ValF = 97 ValS = 116 新V = 176 ValF = 176 ValS = 116 新V = 97 ValF = 97 ValS = 116 "

标签: c encryption vigenere


【解决方案1】:

我可以看到两个问题:

首先,senha[i] 应该是 senha[j]

其次,if (j &gt; sizeS) 应该是if (j &gt;= sizeS)。否则,您将尝试访问包含空终止符的senha[sizeS],而不是字符串中的任何一个字符。

我认为所有试图处理超出打印范围的字符添加的代码都可以替换为:

valF = 32 + ((valF - 32) + (valS - 32)) % (128-32);

【讨论】:

  • 尝试过,输出仍然相同的断环:“ValF = 176 ValS = 116 NewV = 97 ValF = 97 ValS = 116 NewV = 176 ValF = 176 ValS = 116 NewV = 97 ValF = 97 ValS = 116 NewV = 176 ValF = 176 ValS = 116 NewV = 97 ValF = 97 ValS = 116 NewV = 176 ValF = 176 ValS = 116"
  • 我还没有试图弄清楚while 循环有什么问题。我已经用一个使用模数的简单公式更新了答案。
  • 为什么最后一个减法是128而不是127?
  • 因为模运算不包括最大值。
  • 哦,好的,我会阅读模数运算,非常感谢您的解决方案!
【解决方案2】:

这个:

while (a + b > 126)
    a = 31 + b - (a-126);

在以下情况下是一个无限循环:

a + b = 127  && a < 95    
a + b = 128  && a < 96    
etc.

a + b = 127a = 94 的情况下,我们得到a + b 的交替值127129。对于a = 96,它在127132 之间交替,并且第二个值仅随着a 下降或b 上升而上升。

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 2013-03-17
    • 2021-02-15
    • 2022-01-23
    • 2021-01-23
    相关资源
    最近更新 更多