Encrypt Message via Array

Nov 10, 2017 at 12:01am
Could anyone tell me why this code is placing arbitrary trash in certain inputs but not others?

For example, these inputs:
* * ** * * ** * ** *** ** ** **
**************************************************************************************
**********
hello world how are you doing?

Give these outputs:
*** * * **** ***** * **** ******* ~ ~ 
***************************************************************************************************Wa √ √  
** ****** *** ≈ 
ard u rld eoD*?gowohello h i┬╨**Ä~& q q 


But these inputs:
hello world, how are you?
this is a test message!!


Give correct outputs:
hra ,worloe?uoy wd hello
stssees a a*!!egmtithis



I just don't understand why it is doing this at, what seems to be, random.

The object of the code is to take a message, put it in an array, and the "spin out" of the array clockwise (right, down, left, up, right, etc.) and print the message in scrambled order. If the message isn't big enough to fill the array, excess spaces are filled with the "*" symbol. The given array will not be larger that [33][33].


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <string>
#include <cmath>

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;
}
Nov 10, 2017 at 1:43am
Print out the coordinates for each letter in the cout section (add an end line so it prints letter, x, y for each line) and see if it goes out of bounds. It looks like it may be going outside the array.
Nov 10, 2017 at 2:07am
Thank you! I don't know why I didn't think to test that first. As you guessed, I was overflowing because size = sqrt(n) was truncating the double. I knew it was truncating, but I didn't think it would be an issue until I was able to look at the overflow. Because it was truncating, my size on a few was too small to hold message.
Nov 10, 2017 at 4:32am
experience. Many, many, many years of it. You will think of it next time :)
Topic archived. No new replies allowed.