简单加密算法无法使用for循环

时间:2013-11-28 14:00:54

标签: c algorithm

这是我的代码,没有任何for循环和条件:

int decryptedCode[3] = {0};
int encryptedCode[3] = {0};

printf("Enter a four digit code. i.e (1234): ");
scanf("%d%d%d%d", &decryptedCode[0], &decryptedCode[1], &decryptedCode[2], &decryptedCode[3]);

encryptedCode[0] = (decryptedCode[0] + 7); //Encrypting Code
encryptedCode[1] = (decryptedCode[1] + 7); //Encrypting Code
encryptedCode[2] = (decryptedCode[2] + 7); //Encrypting Code        
encryptedCode[3] = (decryptedCode[3] + 7); //Encrypting Code

        if ( encryptedCode[0] > 9 ) encryptedCode[0] = encryptedCode[0]%10;
        if ( encryptedCode[1] > 9 ) encryptedCode[1] = encryptedCode[1]%10;
        if ( encryptedCode[2] > 9 ) encryptedCode[2] = encryptedCode[2]%10;
        if ( encryptedCode[3] > 9 ) encryptedCode[3] = encryptedCode[3]%10;

encryptedCode[0] ^= encryptedCode[2]; //swap values
encryptedCode[2] ^= encryptedCode[0]; //swap values
encryptedCode[0] ^= encryptedCode[2]; //swap values

encryptedCode[1] ^= encryptedCode[3]; //swap values
encryptedCode[3] ^= encryptedCode[1]; //swap values
encryptedCode[1] ^= encryptedCode[3]; //swap values

printf("Encrypted four digit code: %d%d%d%d", encryptedCode[0], encryptedCode[1], encryptedCode[2], encryptedCode[3]);

这里在下面的代码中我添加了for循环n if-else条件以使代码清理n效率:

int counter;
int decryptedCode[3] = {0};
int encryptedCode[3] = {0};

printf("Enter a four digit code. i.e (1234): ");
scanf("%d%d%d%d", &decryptedCode[0], &decryptedCode[1], &decryptedCode[2], &decryptedCode[3]);

for ( counter = 0; counter<= 3; counter++ ) {
    encryptedCode[counter] = (decryptedCode[counter] + 7);
    if ( encryptedCode[counter] > 9 ) {
        encryptedCode[counter] = encryptedCode[counter]%10;
    }
}

encryptedCode[0] ^= encryptedCode[2]; //swap values
encryptedCode[2] ^= encryptedCode[0]; //swap values
encryptedCode[0] ^= encryptedCode[2]; //swap values

encryptedCode[1] ^= encryptedCode[3]; //swap values
encryptedCode[3] ^= encryptedCode[1]; //swap values
encryptedCode[1] ^= encryptedCode[3]; //swap values

printf("Encrypted four digit code: %d%d%d%d", encryptedCode[0], encryptedCode[1], encryptedCode[2], encryptedCode[3]);

但它不起作用,我不知道为什么,我试图整天改变很多东西,但没有成功。

2 个答案:

答案 0 :(得分:2)

您错误地声明了数组:您应该将它们更改为包含四个项目。

int decryptedCode[4] = {0};
int encryptedCode[4] = {0};

目前,您的代码具有未定义的行为。当你的循环“展开”时,编译器可以做一个不同的事情,这就是为什么这两段代码表现出不同的行为(尽管在两种情况下它都是未定义的,因为你引用了超过数组末尾的内存)。

答案 1 :(得分:1)

在C中,对于int a[n],数组索引从0开始,到n-1结束。要访问decryptedCode[3]encryptedCode[3],您必须将数组声明为

int decryptedCode[4] = {0};
int encryptedCode[4] = {0};  

否则它会调用未定义的行为,你会得到任何东西,也可能是你的期望值(如果你是(非)幸运的话)。

n1570:J.2未定义的行为:

  

在以下情况下,行为未定义:
  ......

     

- 数组下标超出范围,即使某个对象显然可以使用   给定下标..