加密数组随机提供任意垃圾

时间:2017-11-10 00:25:13

标签: c++ arrays encryption

所以,我有一个项目,我必须从cin输入一个字符串到一个奇数数组,然后从中心开始,"旋出"顺时针并打印加密的消息。

在大多数情况下,我的工作正常。但是,它为某些输入打印任意垃圾,我无法弄清楚原因。大多数"有问题"输入似乎有*和空格,但即使是一些更简单的输入也会给我带来麻烦。

一些"坏例子"是:

"* * ** * * ** * ** ***  ** ** **"
"**************************************************************************************"
"**********    "
"hello world how are you doing?"

""在尝试运行时遗漏了,我只是把他放在那里,这样你就可以看到每个测试的开始和结束了)

到目前为止,这是我的代码:

#include <iostream>
#include <string>
#include <cmath>
#include <cstdlib>

using namespace std;

int main()
{
    string message;
    int direction=0; //right = 0, down = 1, left = 2, up = 3
    int n, size, i = 0;
    char data[33][33];
    int x, y;
    int stepCount=1, numStep =0;


    getline(cin, message);
    n = message.size();

    size = sqrt(n);

    x = y = size/2 + 0.5;

    if(size*size < n){
        size++;
    }
    if(size%2 == 0){
        size++;
    }

    for(int r=0; r < size; r++){
        for(int c=0; c < size; c++){
            data[r][c] = message[i];
            if(!message[i]){
                data[r][c] = '*';
            }
            i++;
        }
    }

    for(int a=0; a<size*size; a++){
        cout << data[x][y];



       switch(direction){
            case 0: y += 1;
                    break;
            case 1: x+= 1;
                    break;
            case 2: y -= 1;
                    break;
            case 3: x -= 1;
                    break;
       }


       numStep++;
       if(numStep == stepCount){
        direction = (direction+1)%4;
        numStep = 0;
       }
       if(x == y){
        stepCount++;
       }


    }

    return 0;
} 

1 个答案:

答案 0 :(得分:2)

填充data[r][c]的循环可以访问message中不存在的元素,因为size*size如果其中一个条件增加message.size()将大于size } 是真的。您需要检查i是否在邮件之外。

if (!message[i])不是检查此方法的正确方法;在i > message.size()时,message[i]的结果未定义,而不是false

for(int r=0; r < size; r++){
    for(int c=0; c < size; c++){
        data[r][c] = i < n ? message[i] : '*';
        i++;
    }
}