I'm not familiar with Rail Fence cypher but at a first glance your code is full of odd things. Without knowing what rail fence cypher is or how it works I think I do understand what you are trying to do and I tried to correct it. Added some comments as remarks.
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int GRID_ROWS = 3;
const int GRID_COLUMNS = 80;
// Global variables make bunnies cry. Pass it between functions instead.
char GRID[GRID_ROWS][GRID_COLUMNS];
// Wouldn't do function names in caps, but that's a style thing I guess..
int MENU(int menu_choice);
void REVIEW_OF_GRIDS_FIRST_79_CHARACTERS();
int main()
{
// High "This is sparta!" factor. But again a style thing. =)
cout << " This is RAIL FENCE CIPHER\n" << endl;
//-----------------------------------------------------------------------------------------------------
//filing GRID with asterisks(*)
// Changed it to make it easier to read and maintain.
for (int k = 0; k < GRID_ROWS; k++)
{
for (int i = 0; i < GRID_COLUMNS; i++)
{
GRID[k][i] = '*';
}
}
//-----------------------------------------------------------------------------------------------------
//plaintext input into GRID
// Why size 0? Use a string instead.
// char plaintext[0];
string plaintext;
// Might want to use getline. (not sure what your requirements are)
cout << "Enter message to encode:" << " NOTE:Asterisk(*) symbol is not allowed\n";
cin >> plaintext;
// If 99 is irrelvant, why include it? I removed it.
int grid_row[] = {0,1,2,1};
const unsigned int PATTERN_SIZE = sizeof(grid_row) / sizeof(int);
// grid_position_X is equal to plaintext_counter? I removed it.
// Also, …